add

add

RISC-V Assembler Referenz

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

add addiert die Werte in zwei Registern und speichert das Ergebnis in einem dritten. Ein Register ist ein kleiner Platz im Prozessor, der eine einzelne 32-Bit-Zahl enthält. RISC-V stellt 32 Register bereit. Ein Bit ist eine 0 oder 1, und 32 Bits decken ganze Zahlen von 0 bis ungefähr vier Milliarden ab. Arithmetik findet zwischen Registern statt und berührt den Speicher nie direkt.

add hat die untenstehende Form, und das Ergebnis ist rd = rs1 + rs2. rd ist das Zielregister, in das die Antwort kommt. rs1 und rs2 sind die Quellregister, und ihre Werte bleiben gleich.

add rd, rs1, rs2

Das Ziel kann auch als Quelle dienen. Die Zeile unten addiert t1 zu t0 und legt das Ergebnis zurück in t0. Laufende Summen in Schleifen verwenden diese Form.

add t0, t0, t1

Ein Register fasst höchstens 32 Bits. Wenn eine Summe den größten Wert überschreitet, den ein Register fassen kann, läuft das Ergebnis auf eine kleine Zahl über, so wie eine 24-Stunden-Uhr von 23:59 zurück auf 00:00 springt. Das ist ein Überlauf, und RISC-V gibt keine Warnung, wenn er auftritt.

Das RISC-V-Handbuch stellt fest, dass keine ganzzahlige Rechenanweisung eine arithmetische Ausnahme auslöst und dass der Basisbefehlssatz keine Überlaufprüfungen enthält, weil Verzweigungen die Aufgabe kostengünstig erledigen. Für die vorzeichenlose Addition genügt eine Verzweigung nach dem add. In den beiden Zeilen unten springt die Verzweigung zur Marke overflow, wenn die Summe kleiner als ein Operand ist, was nur geschieht, wenn die Summe übergelaufen ist.

add t0, t1, t2
bltu t0, t1, overflow

Im Beispiel verwenden die ersten beiden Zeilen li (load immediate), um die Konstanten 3 und 4 in t0 und t1 zu legen. Die add-Zeile hinterlässt dann 7 in t2.

Beispiel

li t0, 3
li t1, 4
add t2, t0, t1   # t2 = 7