sub

sub

RISC-V Assembler Referenz

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

sub subtrahiert den Wert in einem Register von dem in einem anderen und schreibt das Ergebnis in ein drittes. Es arbeitet mit Registern, den kleinen, nummerierten Speicherplätzen im Prozessor, die jeweils eine 32-Bit-Zahl enthalten.

Die Syntax von sub ist unten dargestellt, und das Ergebnis lautet rd = rs1 – rs2. rd ist das Zielregister, in das das Ergebnis geschrieben wird. rs1 und rs2 sind die Quellregister. Die Reihenfolge ist wichtig, und sie zu vertauschen ist ein häufiger Fehler von Anfängern.

sub rd, rs1, rs2

Die nächste Zeile berechnet t0 minus t1. Die linke Quelle ist der Wert, von dem subtrahiert wird.

sub t2, t0, t1

Es gibt keinen subi-Befehl zum Subtrahieren einer Konstante. addi akzeptiert negative Konstanten, daher bedeutet das Subtrahieren einer festen Zahl das Addieren ihres Negativwerts. Die nächste Zeile verringert den Wert von t0 um eins.

addi t0, t0, -1

RISC-V verfügt über ein spezielles Register namens zero, das immer den Wert 0 enthält. Das Subtrahieren einer Zahl von zero kehrt deren Vorzeichen um, daher wird in der nächsten Zeile das Negative von t1 in t0 gespeichert. Der Befehl neg ist eine Kurzform dafür.

sub t0, zero, t1

Das RISC-V-Handbuch definiert sub als die Subtraktion von rs2 von rs1. Ein Überlauf wird ignoriert, und nur die niedrigstwertigen XLEN-Bits des Ergebnisses werden in rd geschrieben, wobei XLEN die Registerbreite in Bits ist, die hier 32 beträgt. Das Handbuch führt außerdem das Register x0 auf, das dieser Simulator als zero bezeichnet, und gibt an, dass es fest auf einen Wert mit ausschließlich Nullen (0) eingestellt ist.

Im Beispiel ergibt 10 minus 4 den Wert 6 in t2. Vertauscht man die beiden Quellwerte, ergibt sich -6, das der Prozessor in seinem eigenen Schema für negative Zahlen speichert.

Beispiel

li t0, 10
li t1, 4
sub t2, t0, t1   # t2 = 6