lbu

lbu

Asembler RISC-V Referencja

lyszt.net obejmuje lbu i inne instrukcje RISC-V w większych szczegółach.

Format kodowania

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Opis

lbu odczytuje jeden bajt (8 bitów) z pamięci jako wartość bez znaku. Współpracuje z lb, a oba różnią się tylko sposobem wypełniania reszty rejestru. Oba odczytują jeden bajt przy użyciu tego samego adresowania. Strona lb omawia bajty i formę adresowania. Forma lbu znajduje się poniżej.

lbu rd, offset(rs1)

Rejestr przechowuje 32 bity, więc ładowanie 1 bajtu pozostawia 24 bity do wypełnienia. lb kopiuje najwyższy bit bajtu do tych bitów, co jest rozszerzeniem znaku i może dać liczbę ujemną. lbu wypełnia je zerami, więc wynik zawsze mieści się między 0 a 255. Litera u oznacza odczyt bez znaku.

Ładowanie tekstu zwykle używa lbu. Kody znaków są bez znaku, a wiele z nich ma ustawiony najwyższy bit, w tym litery z akcentami i różne symbole. Rozszerzający znak lb czyni je ujemnymi i psuje porównania. Standardowa pętla tekstowa używa lbu. Ładuje bajt, sprawdza, czy jest zerem, co oznacza koniec tekstu, przetwarza go i dodaje 1 do adresu.

Podręcznik RISC-V definiuje lb i lbu jako 8-bitowe wersje ładowania półsłowa, z tym samym adresem efektywnym rejestru rs1 plus 12-bitowym przesunięciem rozszerzonym znakowo. Pamięć jest adresowana bajtowo, więc każdy adres nazywa jeden bajt.

lbu nadaje się również do innych danych bajtowych, w tym kanałów kolorów w obrazach, surowych buforów danych i bajtów instrukcji w interpreterze. Bajty ładowane w ten sposób nie mają znaku do obsługi, więc łączą się bezpośrednio z przesunięciami i OR-ami, gdy większa wartość jest odtwarzana z pojedynczych bajtów. Używaj lb tylko wtedy, gdy dane 8-bitowe są ze znakiem.

Przykład

.data
val: .byte 0xff
.text
la t0, val
lbu t1, 0(t0)   # t1 = 255 (zero-extended)