lb

lb

Asembler RISC-V Referencja

lyszt.net obejmuje lb 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

lb odczytuje jeden bajt z pamięci, który jest najmniejszą jednostką, jaką może pobrać load. Pamięć składa się z bajtów, każdy bajt ma 8 bitów, a jeden adres identyfikuje jeden bajt. lw odczytuje 4 bajty, lh odczytuje 2, a lb odczytuje 1. Używa tego samego adresowania co pozostałe loady: rejestr bazowy plus przesunięcie (zobacz stronę lw). Forma jest pokazana poniżej.

lb rd, offset(rs1)

Rejestr przechowuje 32 bity, a bajt przechowuje 8, więc górne 24 bity potrzebują wartości. lb rozszerza znak: kopiuje górny bit bajtu do wszystkich górnych bitów, zachowując wartość jako liczbę ze znakiem. Bajt przechowujący -5 przychodzi jako 32-bitowe -5.

Wybór między ze znakiem a bez znaku ma największe znaczenie dla tekstu, najczęstszego danych bajtowych, ponieważ kody znaków są bez znaku. Wiele kodów znaków ma ustawiony górny bit. Wczytanie takiego kodu za pomocą rozszerzającego znak lb daje liczbę ujemną, a porównania ze zwykłymi dodatnimi kodami znaków wtedy zawodzą. Użyj lbu, load byte unsigned, dla tekstu; wypełnia górne bity zerami. Użyj lb dla danych ze znakiem, takich jak małe przesunięcia, które mogą być dodatnie lub ujemne.

Podręcznik RISC-V definiuje lb i lbu jako 8-bitowe wersje loadów półsłowa, z tym samym adresem efektywnym rejestru rs1 plus rozszerzone znakiem 12-bitowe przesunięcie. Pamięć jest adresowana bajtowo, więc jeden adres identyfikuje jeden bajt.

Bajty leżą jeden adres od siebie, więc pętla przechodzi przez tablicę bajtów, dodając 1 do adresu. Typowa pętla odczytuje bajt, sprawdza, czy jest zerem (znacznikiem końca tekstu), działa na nim i zwiększa adres o 1.

Przykład

.data
val: .byte -5
.text
la t0, val
lb t1, 0(t0)   # t1 = -5 (sign-extended)