bne

bne

RISC-V 汇编 参考

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

编码格式

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

描述

bne 表示 branch if not equal(不相等则分支),是 beq 的对应指令。它比较两个寄存器,当它们不相等时跳转到带标签的位置。当它们相等时,执行继续到下一条指令。其形式如下所示。分支、标签以及按条件跳转在 beq 页面中说明。

bne rs1, rs2, label

beq 和 bne 共同处理所有相等与不相等的判断。汇编常常以反向形式陈述条件。若要仅当两个值相等时运行一段代码块,请用 bne 绕过该代码块进行分支。当值不相等时,代码跳过该代码块;当值相等时,代码进入该代码块。

bne 还能在条件成立时维持循环运行。一个一直运行到某个值达到目标的循环,以一条跳回顶部的 bne 结束。文本读取遵循这一模式,其中只要当前字符不是标记结束的零字节,循环就继续。

RISC-V 手册指出,beq 和 bne 在寄存器 rs1 和 rs2 相等或不相等时进行分支。偏移量是一个以 2 字节的倍数计数的 12 位值,因此分支可向任一方向到达约 4 KiB,其中 1 KiB 为 1024 字节。

bnez 是与零比较的简写形式,即询问某个值是否不为零。bne 中的比较与 beq 中一样,是位的单纯相等性比较,因此有符号和无符号解读并不重要。

示例

li t0, 1
li t1, 2
bne t0, t1, done   # t0 != t1, so jump to 'done'