blt

blt

RISC-V 汇编 参考

lyszt.net 更详细地介绍了 blt 和其他 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

描述

blt 比较两个值,并在第一个值较小时分支。beq 和 bne 则测试相等性。该名称代表 branch if less than。下面的形式在 rs1 小于 rs2 时跳转到带标签的位置,否则继续执行下一条指令。

blt rs1, rs2, label

beq 页面解释了分支、标签以及跳转的工作方式。

该比较将两个值都视为有符号数,因此它们可以为负数。-1 小于 0,任何负数都小于任何正数。无符号比较使用单独的指令 bltu,对于最高位被置位的任何值,两者的结果都不一致。

计数循环依赖 blt。下面这行在计数器 t0 保持小于其上限 t1 时重复执行。

blt t0, t1, loop

一旦计数器达到上限,就不采用该分支,循环结束。边界检查也使用同一条指令,在程序使用某个值之前将其保持在最大值以下。

RISC-V 手册规定,blt 和 bltu 在 rs1 小于 rs2 时采用分支,分别进行有符号和无符号比较。它还指出,可以通过反转 blt、bltu、bge 和 bgeu 的操作数来合成 bgt、bgtu、ble 和 bleu。

RISC-V 没有 branch if greater。要测试 a 是否大于 b,可以反转比较,测试 b 是否小于 a。汇编器提供了 bgt 简写,会为你交换操作数。

示例

li t0, 2
li t1, 5
blt t0, t1, done   # 2 < 5, so jump to 'done'