beqz
Pseudoelementlyszt.net behandelt beqz und andere RISC-V-Befehle ausführlicher.
Beschreibung
beqz verzweigt, wenn ein Register null enthält. Der Name bedeutet „verzweige, wenn gleich null“. Mit der untenstehenden Form springt der Prozessor zur beschrifteten Position, wenn rs null ist, andernfalls fährt er mit der nächsten Anweisung fort.
beqz rs, label
beqz ist eine Pseudoanweisung, ein lesbarer Name, den der Assembler in eine echte Anweisung umschreibt. Sie wird zur untenstehenden Anweisung, die das Register mit zero vergleicht, dem speziellen Register, das immer 0 enthält.
beq rs, zero, label
beqz bietet eine kürzere Schreibweise für den häufigsten Vergleich. Siehe beq für die Funktionsweise von Verzweigungen und Beschriftungen.
Null kommt in maschinennahem Code häufig vor, weshalb es die Kurzschreibweise gibt. Ein Nullbyte markiert das Ende eines Textes. Null ist das übliche Signal, dass eine Operation erfolgreich war. Null steht auch für einen leeren oder fehlenden Wert, und Countdown-Schleifen enden bei null. Der Nulltest wird nach dem Laden eines Zeichens verwendet, um das Ende einer Zeichenkette zu erkennen, bei einem zurückgegebenen Status, um den Erfolgspfad zu nehmen, und bei einem Zähler, um eine Schleife zu beenden.
Das RISC-V-Handbuch nennt einen Grund, warum seine Verzweigungen zwei Register vergleichen, statt ein Register mit null zu vergleichen. Vergleiche mit null erfordern eine nicht triviale Schaltungsverzögerung, daher sind sie fast so teuer wie arithmetische Größenvergleiche. beqz ist deshalb eine Pseudoanweisung, die beq mit zero verwendet.
Die erste Zeile unten liest sich klarer als die zweite, die den Vergleich mit null ausschreibt.
beqz t0, done beq t0, zero, done
Pseudoanweisungen existieren der Lesbarkeit wegen, und der Maschinencode, den sie erzeugen, ist identisch. Ihr Gegenstück ist bnez, das verzweigt, wenn ein Wert nicht null ist.
Wird erweitert zu
beq rs, zero, label
Der Assembler ersetzt diese Pseudoanweisung durch die oben aufgeführte(n) echte(n) Anweisung(en).
Beispiel
li t0, 0 beqz t0, done # t0 == 0, so jump to 'done'
