sh

sh

Asembler RISC-V Referencja

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

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