lhu

lhu

Asembler RISC-V Referencja

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

lhu odczytuje półsłowo (16 bitów, czyli 2 bajty) z pamięci i traktuje je jako wartość bez znaku. Współpracuje z lh, a obie różnią się sposobem wypełniania górnej połowy rejestru docelowego. Obie odczytują 16 bitów z tym samym adresowaniem. Półsłowa i forma adresowania są omówione na stronie lh. Forma lhu jest pokazana poniżej.

lhu rd, offset(rs1)

Rejestr przechowuje 32 bity, więc ładowanie 16-bitowe musi wypełnić górne 16. lh kopiuje bit znaku na te bity, co zachowuje liczby ujemne jako ujemne. lhu wypełnia je zerami, co nazywa się rozszerzeniem zerowym, więc wynik jest zawsze nieujemny, od 0 do 65535. Litera u w nazwie oznacza odczyt bez znaku.

To dane decydują, którego użyć. Wybierz lh dla wartości, które mogą być ujemne, a lhu dla wartości, które nigdy nie są ujemne. Wzorzec bitowy 0xFFFF załadowany przez lhu to 65535, a te same bity załadowane przez lh to -1.

Podręcznik RISC-V definiuje lhu jako ładowanie 16-bitowej wartości z pamięci i rozszerzanie jej zerami do 32 bitów przed zapisaniem w rd. Adres efektywny to rejestr rs1 plus 12-bitowe przesunięcie z rozszerzeniem znaku.

Większość danych 16-bitowych jest bez znaku. Kody znaków w niektórych kodowaniach tekstu, numery portów i sumy kontrolne w danych sieciowych, 16-bitowe formaty pikseli oraz pola długości w formatach plików to przykłady. Rozszerzenie znaku dałoby błędną wartość dla każdego z nich, gdy górny bit jest ustawiony, więc lhu jest właściwym ładowaniem. Półsłowa są oddalone od siebie o 2 bajty, więc pętle po nich przesuwają adres o 2.

Przykład

.data
val: .half 0xffff
.text
la t0, val
lhu t1, 0(t0)   # t1 = 65535 (zero-extended)