sh

sh

RISC-V Assembler Referenz

lyszt.net behandelt sh und andere RISC-V-Befehle ausführlicher.

Kodierungsformat

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

Beschreibung

sh schreibt ein Halbwort, 16 Bits oder 2 Bytes, in den Speicher. Es entspricht den Ladebefehlen lh und lhu und speichert die schmalere Größe, wo sw das volle Wort speichert. Die Form ist unten dargestellt. Es nimmt den Wert im Quellregister rs2 und schreibt seine niedrigsten 16 Bits an die Adresse im Basisregister rs1 plus dem Offset. Das Layout entspricht sw, wobei das Quellregister zuerst genannt wird.

sh rs2, offset(rs1)

Ein Register hält 32 Bits und nur 16 werden gespeichert, also behält sh die niedrigsten 16 und verwirft die oberen 16. Speicherungen haben keine vorzeichenbehaftete oder vorzeichenlose Wahl. Diese Wahl gehört zu den Ladebefehlen, wo ein schmaler Wert erweitert werden muss, um ein Register zu füllen, und die fehlenden Bits eine Regel brauchen. Eine Speicherung verengt den Wert, und die niedrigen Bits zu behalten ist das einzige Verhalten, das Sinn ergibt. Wenn das Register einen Wert enthält, der zu groß für 16 Bits ist, gehen die zusätzlichen Bits ohne Warnung verloren, also prüfen Sie den Bereich vor dem Speichern.

Das RISC-V-Handbuch sagt, dass sh die niedrigen 16 Bits des Registers rs2 in den Speicher an der Adresse von rs1 plus dem vorzeichenerweiterten 12-Bit-Offset speichert. Halbwort-Speicherungen an geraden Adressen sind natürlich ausgerichtet und lösen niemals einen Ausrichtungsfehler aus. Eine Speicherung an eine Adresse, die nicht natürlich ausgerichtet ist, verhält sich wie die Ausführungsumgebung es definiert, und das Handbuch sagt, dass sie extrem langsam laufen kann.

sh schreibt jedes 16-Bit-Format, das lh und lhu zurücklesen, wie Audio-Samples, 16-Bit-Pixeldaten und Halbwort-Arrays. Ein häufiges Muster ist Lesen, Ändern und Schreiben. Laden Sie ein Halbwort mit lhu, passen Sie es im Register an und speichern Sie es mit sh zurück. Nur die gezielten 2 Bytes ändern sich und die Bytes um sie herum bleiben wie sie waren. Halbwörter liegen 2 Bytes auseinander, also verschieben Schleifen die Adresse um 2.

Beispiel

la t0, slot
li t1, -5
sh t1, 0(t0)   # memory at slot now holds the low 16 bits of -5