lh

lh

Asembler RISC-V Referencja

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

lh ładuje półsłowo z pamięci. Bajt to 8 bitów i ma własny adres, co czyni go najmniejszą adresowalną jednostką. Słowo to 4 bajty, czyli 32 bity, a półsłowo to połowa tego: 2 bajty, czyli 16 bitów. lh odczytuje 16 bitów, podczas gdy lw odczytuje 32. Adresowanie jest takie samo jak w lw: rejestr bazowy plus stały offset (zobacz stronę lw). Postać pokazano poniżej.

lh rd, offset(rs1)

Rejestr przechowuje 32 bity, więc 16-bitowe ładowanie musi wypełnić pozostałe 16 bitów. lh używa rozszerzenia znaku. Odczytuje najstarszy bit 16-bitowej wartości, który oznacza znak liczby ze znakiem, i kopiuje ten bit do wszystkich 16 górnych bitów rejestru. Wartość zachowuje swój znak, więc 16-bitowe -3 trafia jako 32-bitowe -3.

Używaj lh dla 16-bitowych danych ze znakiem, takich jak próbki audio lub odczyty czujników, które mogą być ujemne. Jego partner lhu, gdzie u oznacza unsigned (bez znaku), wypełnia górę zerami, co pasuje do danych, które nigdy nie są ujemne. Wzorzec bitowy 0x8000 załadowany przez lh staje się -32768, a załadowany przez lhu staje się +32768. Bity w pamięci pozostają takie same, a to ładowanie decyduje o znaczeniu.

Podręcznik RISC-V definiuje lh jako ładowanie 16-bitowej wartości z pamięci i rozszerzanie jej znakiem do 32 bitów przed zapisaniem w rd. Adres efektywny to rejestr rs1 plus 12-bitowy offset rozszerzony znakiem. Dostęp jest naturalnie wyrównany, gdy jego adres jest podzielny przez rozmiar dostępu w bajtach, więc dostęp półsłowa jest wyrównany pod adresami parzystymi.

Półsłowa mają 2 bajty, więc tablice takich wartości leżą pod offsetami 0, 2, 4, a wskaźnik przesuwa się przez nie, dodając 2.

Przykład

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