bgez伪

bgez

伪
RISC-V 汇编 参考

lyszt.net 更详细地介绍了 bgez 和其他 RISC-V 指令。

描述

bgez 在寄存器中的值为零或正数时进行分支。这个名称的意思是 branch if greater than or equal to zero(大于或等于零时分支)。下面的形式在 rs 至少为零时跳转到带标签的位置,否则继续执行下一条指令。

bgez rs, label

汇编器将其视为伪指令,并将其重写为下面的指令,该指令将寄存器与 zero(始终保存 0 的寄存器)进行比较。

bge rs, zero, label

比较是有符号的,因此寄存器中的 32 位被读取为可以取负值的数。零也算作匹配,这正是 bgez 与 bgtz 的区别所在。它与 bltz 相反,因此对于任何值,两者中恰好有一个会进行分支。关于两个寄存器的比较,请参见 bge。

bgez 是对不得为负的值(例如长度、计数或索引)的自然测试。一个从计数器减一并只要计数器未低于零就持续循环的程序,会在循环末尾使用它。

addi t0, t0, -1
bgez t0, loop

上面的循环在减法之后只要 t0 为 0 或更大就重复,因此它会在 t0 等于 0 时再运行一次,并在 t0 达到 -1 时停止。

展开为

bge rs, zero, label

汇编器会将此伪指令替换为上面列出的真实指令或指令。

示例

li t0, 4
bgez t0, done   # t0 >= 0, so jump to 'done'