slt

slt

RISC-V 汇编 参考

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

描述

slt 比较两个数,并将结果存储为 1 或 0。这个名称代表 set less than。下面的形式测试 rs1 是否小于 rs2。如果测试成功,该指令会将 1 写入目标寄存器 rd。如果失败,则写入 0。

slt rd, rs1, rs2

比较可以以两种方式使用。分支指令会根据它进行跳转。或者,是或否的答案可以存储为数字,真为 1,假为 0,并在之后使用。slt 负责存储。汇编用存储的 1 或 0 表示真和假,而这个值可以像任何其他数字一样被相加、掩码或组合。

比较将这些值视为有符号数,因此它们可以为负数,而 -1 被视为小于 0。相关指令 sltu 将它们视为无符号数,这会改变大数值以及看起来像负数的值的答案。

RISC-V 手册将 slt 和 sltu 描述为有符号和无符号比较,如果 rs1 小于 rs2,则将 1 写入 rd,否则写入 0。它还在一般有符号加法的溢出检查中使用了 slt。在加法之后,下面的第二行记录第二个操作数是否为负数,第三行记录和是否小于第一个操作数,最后一行在两个答案不同时跳转。

add t0, t1, t2
slti t3, t2, 0
slt t4, t0, t1
bne t3, t4, overflow

其理由是,只有当另一个操作数为负数时,和才应小于其中一个操作数。

不存在 set greater than 指令。要测试 a 是否大于 b,请交换操作数,并询问 b 是否小于 a。该示例比较 3 和 9。由于 3 小于 9,t2 被设置为 1。

示例

li t0, 3
li t1, 9
slt t2, t0, t1   # t2 = 1