sh
lyszt.net obejmuje sh i inne instrukcje RISC-V w większych szczegółach.
Format kodowania
Opis
sh zapisuje półsłowo, 16 bitów lub 2 bajty, do pamięci. Odpowiada ładowaniom lh i lhu i zapisuje węższy rozmiar tam, gdzie sw zapisuje pełne słowo. Forma jest pokazana poniżej. Pobiera wartość z rejestru źródłowego rs2 i zapisuje jej najniższe 16 bitów pod adresem w rejestrze bazowym rs1 plus przesunięcie. Układ odpowiada sw, z rejestrem źródłowym wymienionym jako pierwszy.
sh rs2, offset(rs1)
Rejestr przechowuje 32 bity, a zapisywanych jest tylko 16, więc sh zachowuje najniższe 16 i odrzuca górne 16. Zapisy nie mają wyboru między ze znakiem a bez znaku. Ten wybór należy do ładowań, gdzie wąska wartość musi zostać rozszerzona, aby wypełnić rejestr, a brakujące bity wymagają reguły. Zapis zawęża wartość, a zachowanie niskich bitów to jedyne zachowanie, które ma sens. Jeśli rejestr przechowuje wartość zbyt dużą dla 16 bitów, dodatkowe bity są tracone bez ostrzeżenia, więc sprawdź zakres przed zapisem.
Podręcznik RISC-V mówi, że sh zapisuje niskie 16 bitów rejestru rs2 do pamięci pod adresem rs1 plus 12-bitowe przesunięcie z rozszerzeniem znaku. Zapisy półsłowa pod adresami parzystymi są naturalnie wyrównane i nigdy nie zgłaszają błędu wyrównania. Zapis pod adresem, który nie jest naturalnie wyrównany, zachowuje się zgodnie z definicją środowiska wykonawczego, a podręcznik mówi, że może działać wyjątkowo wolno.
sh zapisuje każdy format 16-bitowy, który lh i lhu odczytują z powrotem, takie jak próbki audio, dane pikseli 16-bitowych i tablice półsłów. Częstym wzorcem jest odczyt, modyfikacja i zapis. Załaduj półsłowo za pomocą lhu, dostosuj je w rejestrze i zapisz z powrotem za pomocą sh. Zmieniają się tylko docelowe 2 bajty, a bajty wokół nich pozostają takie, jak były. Półsłowa są oddalone od siebie o 2 bajty, więc pętle przesuwają adres o 2.
Przykład
la t0, slot li t1, -5 sh t1, 0(t0) # memory at slot now holds the low 16 bits of -5
