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