bnez
伪lyszt.net 更详细地介绍了 bnez 和其他 RISC-V 指令。
描述
bnez 在寄存器持有非零值时分支。这个名称的意思是 branch if not equal to zero。下面的形式在 rs 非零时跳转到标签。
bnez rs, label
汇编器将这条伪指令展开为下面的指令,它与始终持有零的寄存器进行比较。
bne rs, zero, label
关于零测试参见 beqz,关于一般分支参见 beq。
beqz 经常守护退出,而 bnez 经常让循环持续运行。只要还有字符要读取,循环就继续扫描。只要计数器还没有耗尽,它就继续前进。常见的短循环结尾会递减一个寄存器,并在值非零时循环。它减一,然后用 bnez 跳回顶部。
bnez 也作用于先前计算出的真或假值。诸如 slt 这样的设置指令会在寄存器中留下 1 或 0,随后的 bnez 根据该结果分支。持有是或否值的寄存器可以用 bnez 测试。
RISC-V 手册给出了其分支比较两个寄存器而不是将一个寄存器与零比较的一个原因。与零的比较需要不可忽略的电路延迟,因此其代价几乎与算术大小比较一样大。因此 bnez 是一条使用带 zero 的 bne 的伪指令。
另一个常见用途是检查结果。当函数对成功返回 0、对失败返回非零时,调用者在调用之后跟上下面这一行,以便在出现任何问题时跳转到错误处理。这是检查返回码的汇编形式。
bnez a0, error
展开为
bne rs, zero, label
汇编器会将此伪指令替换为上面列出的真实指令或指令。
示例
li t0, 5 bnez t0, done # t0 != 0, so jump to 'done'
