lb
lyszt.net obejmuje lb i inne instrukcje RISC-V w większych szczegółach.
Format kodowania
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)
