slt
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
简三的图詰
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.2, Integer Register-Register Instructions, page 29.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4, Integer Computational Instructions, page 27.
