bne

bne

RISC-V Assembler Referenz

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

bne bedeutet branch if not equal (verzweigen, wenn ungleich) und ist das Gegenstück zu beq. Es vergleicht zwei Register und springt zur beschrifteten Position, wenn sie sich unterscheiden. Wenn sie übereinstimmen, wird die Ausführung mit der nächsten Anweisung fortgesetzt. Die Form ist unten dargestellt. Verzweigungen, Labels und das Springen bei einer Bedingung werden auf der beq-Seite erklärt.

bne rs1, rs2, label

Zusammen decken beq und bne jede Entscheidung über gleich und ungleich ab. In Assembler wird eine Bedingung oft in umgekehrter Form angegeben. Um einen Codeblock nur dann auszuführen, wenn zwei Werte gleich sind, verzweigt man mit bne um diesen Block herum. Der Code überspringt den Block, wenn die Werte sich unterscheiden, und betritt ihn, wenn sie übereinstimmen.

bne hält außerdem eine Schleife aufrecht, solange eine Bedingung gilt. Eine Schleife, die läuft, bis ein Wert ein Ziel erreicht, endet mit einem bne, das zurück an den Anfang springt. Das Lesen von Text folgt diesem Muster, wobei die Schleife fortgesetzt wird, solange das aktuelle Zeichen nicht das Nullbyte ist, das das Ende markiert.

Das RISC-V-Handbuch sagt, dass beq und bne die Verzweigung ausführen, wenn die Register rs1 und rs2 gleich oder ungleich sind. Der Offset ist ein 12-Bit-Wert, gezählt in Vielfachen von 2 Bytes, sodass eine Verzweigung in beide Richtungen etwa 4 KiB erreicht, wobei ein KiB 1024 Bytes ist.

bnez ist die Kurzform für den Vergleich mit null, der fragt, ob ein Wert ungleich null ist. Der Vergleich in bne ist, wie in beq, eine reine Gleichheit von Bits, sodass vorzeichenbehaftete und vorzeichenlose Lesarten keine Rolle spielen.

Beispiel

li t0, 1
li t1, 2
bne t0, t1, done   # t0 != t1, so jump to 'done'