sw

sw

RISC-V Assembler Referenz

lyszt.net behandelt sw 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

sw nimmt einen Wert aus einem Register und schreibt ihn in den Speicher, das Gegenteil von lw. Der Name steht für store word (Wort speichern), und ein Wort umfasst 32 Bits. Ladevorgänge bewegen Daten aus dem Speicher in Register, damit sie bearbeitet werden können, und Speichervorgänge senden Ergebnisse zurück. Die beiden Befehle bilden den Lade-, Berechnungs- und Speicherzyklus von RISC-V, da Arithmetik nur in Registern stattfindet.

Die Syntax von sw ist unten dargestellt. Die Operandenreihenfolge unterscheidet sich von den meisten Befehlen.

sw rs2, offset(rs1)

rs2 enthält den zu schreibenden Wert. Der zweite Operand, offset(rs1), gibt die Zieladresse im Speicher an: die Adresse im Basisregister rs1 plus einen kleinen konstanten Offset, dieselbe Adressierung, die lw verwendet. Die folgende Zeile schreibt den Wert in t1 an die Adresse, die in t0 steht.

sw t1, 0(t0)

sw lässt jedes Register unverändert. Seine Wirkung betrifft ausschließlich den Speicher, während fast jeder andere Befehl ein Register schreibt.

Das RISC-V-Handbuch gibt an, dass sw, sh und sb 32-Bit-, 16-Bit- und 8-Bit-Werte aus den niedrigen Bits des Registers rs2 in den Speicher schreiben. Die effektive Adresse ist das Register rs1 plus der vorzeichenerweiterten 12-Bit-Offset. Lade- und Speichervorgänge an natürlich ausgerichteten Adressen lösen niemals einen Ausrichtungsfehler aus, und das Handbuch garantiert, dass sie atomar als ein unteilbarer Schritt ausgeführt werden.

Speichervorgänge sichern Ergebnisse in Arrays und Variablen, und eine Funktion verwendet sie, um Werte in ihrem Scratch-Bereich auf dem Stack abzulegen. Ein Speichervorgang überschreibt alle 4 Bytes an der Zieladresse. Das Beispiel schreibt 99 an eine beschriftete Stelle im Speicher und ersetzt, was sich dort befand. Der Speicher behält diesen Wert, bis ein weiterer Speichervorgang ihn überschreibt, anders als ein Register.

Beispiel

la t0, slot
li t1, 99
sw t1, 0(t0)   # memory at slot now holds 99