add

add

RISC-V 汇编 参考

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

描述

add 将两个寄存器中的值相加,并将结果存入第三个寄存器。寄存器是处理器内部的一个小槽位,用于存放一个 32 位数字。RISC-V 提供 32 个寄存器。一个位是一个 0 或 1,32 位可以覆盖从 0 到大约四十亿的整数。算术运算在寄存器之间进行,从不直接接触内存。

add 的形式如下,结果为 rd = rs1 + rs2。rd 是目标寄存器,答案存放于此。rs1 和 rs2 是源寄存器,它们的值保持不变。

add rd, rs1, rs2

目标寄存器也可以作为源寄存器使用。下面这行将 t1 加到 t0,并将结果放回 t0。循环中的累计求和就使用这种形式。

add t0, t0, t1

一个寄存器最多存放 32 位。当和超过寄存器能存放的最大值时,结果会回绕成一个很小的数,就像 24 小时制时钟从 23:59 回到 00:00 一样。这就是溢出,RISC-V 在发生溢出时不会给出任何警告。

RISC-V 手册指出,整数计算指令不会引发算术异常,并且基础指令集不包含溢出检查,因为分支能以低成本完成这项工作。对于无符号加法,add 之后的一条分支就足够了。在下面两行中,当和小于某个操作数时,分支跳转到标签 overflow,这种情况只有在和发生回绕时才会出现。

add t0, t1, t2
bltu t0, t1, overflow

在示例中,前两行使用 li(load immediate)将常量 3 和 4 放入 t0 和 t1。随后 add 那一行将 7 留在 t2 中。

示例

li t0, 3
li t1, 4
add t2, t0, t1   # t2 = 7