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