beqz伪

beqz

伪
RISC-V 汇编 参考

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

描述

beqz 在寄存器为零时分支。这个名称的意思是“等于零则分支”。使用下面的形式时,当 rs 为零,处理器跳转到带标签的位置,否则继续执行下一条指令。

beqz rs, label

beqz 是一条伪指令,是一个可读的名称,汇编器会把它改写成真正的指令。它变成下面的指令,将寄存器与 zero 比较,zero 是始终保存 0 的特殊寄存器。

beq rs, zero, label

beqz 提供了一种更短的写法来表示最常见的比较。关于分支和标签如何工作,请参见 beq。

零在底层代码中经常出现,这就是存在这种简写的原因。零字节标记文本的结尾。零是操作成功的常见信号。零还表示空值或缺失值,倒计数循环在零处结束。零测试用于在加载字符后检测字符串结尾、在返回的状态上走成功路径,以及在计数器上结束循环。

RISC-V 手册给出了它的分支比较两个寄存器而不是将一个寄存器与零比较的一个原因。与零比较需要不可忽略的电路延迟,因此几乎和算术大小比较一样昂贵。因此 beqz 是一条使用带 zero 的 beq 的伪指令。

下面的第一行比第二行读起来更清晰,第二行明确写出了与零的比较。

beqz t0, done
beq t0, zero, done

伪指令的存在是为了可读性,它们产生的机器码完全相同。它的相反指令是 bnez,在值不为零时分支。

展开为

beq rs, zero, label

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

示例

li t0, 0
beqz t0, done   # t0 == 0, so jump to 'done'