div

div

RISC-V 汇编 参考

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

描述

div 将一个寄存器除以另一个寄存器。它读取源寄存器 rs1 和 rs2,将第一个除以第二个,并将结果写入目标寄存器 rd。下面的形式表示 rd = rs1 / rs2。

div rd, rs1, rs2

与乘法一样,它属于可选数学指令的 M 扩展,本模拟器包含该扩展。

这是整数除法,因此小数部分被丢弃。7 除以 2 得 3。余下的 1 来自 rem,它计算相同两个数的余数。负结果向零舍入,因此 -7 / 2 得 -3。

除以零返回 -1,即每一位都设为 1 的寄存器。硬件不给出警告,因此必须将零除数视为错误的代码会在除法前检查除数。

RISC-V 手册规定了特殊情况。除以零得到的商每一位都置位,对于 div 读作 -1,余数等于被除数。有符号溢出仅发生在最负的数除以 -1 时。此时商等于被除数,余数为零。手册说,除以零时陷入曾被考虑但被拒绝,因为这将是指令集中唯一的算术陷入,而全部位置位可使除法电路保持简单。

对于任何不溢出的除法,被除数等于除数乘以商加余数。当商和余数都需要时,手册推荐下面两行,其中 rdq 不同于 rs1 和 rs2。处理器随后可以将两者融合为一次除法。

div rdq, rs1, rs2
rem rdr, rs1, rs2

除法是处理器执行的最慢算术运算,通常比乘法慢许多倍。除以 2 的幂(2、4、8 等)可以改用右移(参见 srai)。示例将 17 除以 5。5 进入 17 三次整,余 2,因此商 3 进入 t2。

示例

li t0, 17
li t1, 5
div t2, t0, t1   # t2 = 3