bnezPseudoelement

bnez

Pseudoelement
RISC-V Assembler Referenz

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

Beschreibung

bnez verzweigt, wenn ein Register einen anderen Wert als null enthält. Der Name bedeutet branch if not equal to zero. Die folgende Form springt zur Marke, wenn rs ungleich null ist.

bnez rs, label

Der Assembler erweitert diese Pseudoinstruktion zu der folgenden Instruktion, die mit dem Register vergleicht, das immer null enthält.

bne rs, zero, label

Für den Nulltest siehe beqz, und für Verzweigungen im Allgemeinen siehe beq.

beqz sichert häufig Ausgänge ab, während bnez häufig eine Schleife am Laufen hält. Solange noch Zeichen zu lesen sind, tastet die Schleife weiter ab. Solange der Zähler nicht abgelaufen ist, läuft sie weiter. Ein häufiges kurzes Schleifenende dekrementiert ein Register und schleift, solange der Wert ungleich null ist. Es subtrahiert eins und springt dann mit bnez zurück an den Anfang.

bnez wirkt auch auf früher berechnete wahre oder falsche Werte. Set-Instruktionen wie slt hinterlassen eine 1 oder 0 in einem Register, und ein folgendes bnez verzweigt aufgrund dieses Ergebnisses. Ein Register, das einen Ja-oder-Nein-Wert enthält, kann mit bnez getestet werden.

Das RISC-V-Handbuch nennt einen Grund, warum seine Verzweigungen zwei Register vergleichen, statt ein Register mit null zu vergleichen. Ein Vergleich mit null benötigt eine nicht triviale Schaltungsverzögerung, kostet also fast so viel wie ein arithmetischer Größenvergleich. bnez ist daher eine Pseudoinstruktion, die bne mit zero verwendet.

Ein weiterer häufiger Einsatz prüft Ergebnisse. Wenn eine Funktion 0 für Erfolg und ungleich null für Fehler zurückgibt, folgt der Aufrufer dem Aufruf mit der folgenden Zeile, um zur Fehlerbehandlung zu springen, wann immer etwas schiefgelaufen ist. Dies ist die Assemblerform der Prüfung eines Rückgabecodes.

bnez a0, error

Wird erweitert zu

bne rs, zero, label

Der Assembler ersetzt diese Pseudoanweisung durch die oben aufgeführte(n) echte(n) Anweisung(en).

Beispiel

li t0, 5
bnez t0, done   # t0 != 0, so jump to 'done'