ADD

RISC-V ADD 指令详解

指令手册R-type

将rs1与rs2相加,结果写入rd

指令语法

add rd, rs1, rs2
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数寄存器。
源寄存器 rs2:第二个操作数寄存器。
RV32IRV64I算术运算

指令行为说明

ADD 采用 R 型格式(opcode=0110011,funct7=0000000,funct3=000)。将 rs1 与 rs2 的整数寄存器值相加,仅保留低 XLEN 位并写入 rd;算术溢出不会引发异常。rd=x0 时丢弃目的寄存器写入,x0 仍为零。

ADD 指令解析与执行动画

从机器码字段解析开始,依次展示操作数读取、该指令专属语义计算和 ISA 可见状态更新。

rd
rs1
rs2
add
,
,
执行环境

本例使用固定寄存器初值和初始 PC=0x2000;取指成功,没有异步中断或额外扩展检查。异常分支只显示普通提交停止,陷入后的 PC 和处理程序状态由 EEI 决定。

t1(x6)
0x00000014
t2(x7)
0x00000007
31..25
24..20
19..15
14..12
11..7
6..0
0000000
funct7
00111
rs2
00110
rs1
000
funct3
00101
rd
0110011
opcode
执行数据路径
instruction
0x007302B3
opcode
0110011 -> OP
funct3
000 -> ADD
funct7
0000000 -> base ALU op
rd / rs1 / rs2
t0(x5) / t1(x6) / t2(x7)
ALU
尚未计算
x5
t0(x5) = 0x00003001; pc = 0x00002000
当前步骤

概念步骤:拿到 32-bit 指令编码

机器码按当前指令格式切成字段,动画从 encoding/decode 开始。

encoding: 0x007302B3
syntax : add x5, x6, x7
待提交结果: 尚未计算
当前架构状态
t0(x5) = 0x00003001; pc = 0x00002000

该动画展示 ISA 可见的解码和状态变化,不表示任何特定 CPU 的流水线、缓存、预测或时序实现。

快速理解与检索要点

ADD 是寄存器到寄存器的整数加法。RV32I/RV64I 语义是把 rs1 与 rs2 相加并写入 rd,算术溢出不会产生异常,结果按 XLEN 宽度截断。

两个源操作数都来自寄存器;需要加小立即数时使用 ADDI。
ADD 与 SUB 使用相同 opcode 和 funct3,主要由 funct7 区分。

官方规范要点

以下要点按 RISC-V Unprivileged ISA 手册核准,用于补充操作语义、立即数范围和边界行为。

指令对比

ADD vs ADDI

ADD 使用两个寄存器操作数(rs1 + rs2),而 ADDI 使用一个寄存器和一个 12 位有符号立即数(rs1 + imm)。ADD 是 R-type 指令(opcode 0110011),ADDI 是 I-type 指令(opcode 0010011)。ADDI 的立即数可编码范围为 -2048 到 2047;ADD 的第二个加数来自 rs2,不是立即数。

ADD vs SUB

ADD 和 SUB 都是 R-type 指令,共享 opcode=0110011 和 funct3=000。ADD 的 funct7=0000000,计算 rs1+rs2;SUB 的 funct7=0100000,计算 rs1-rs2。两者都保留结果的低 XLEN 位,算术溢出不触发异常。

常见使用场景

地址与指针

结合 «add x5, x6, x7 # RV32I/RV64I: x6=20, x7=7 -> x5=27» 等实际代码理解该场景。

寄存器操作

结合 «add x5, x6, x7 # RV32I/RV64I: x6=20, x7=7 -> x5=27» 等实际代码理解该场景。

循环与迭代

结合 «add x5, x6, x7 # RV32I/RV64I: x6=20, x7=7 -> x5=27» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 寄存器操作数选择 x0 到 x31;ABI 寄存器名是这些寄存器的别名。
  • ADD 使用 rd、rs1、rs2 三个寄存器字段,没有立即数操作数。
语义检查
  • rs1+rs2 只保留结果的低 XLEN 位;算术溢出不触发异常,写入 x0 被丢弃。

容易混淆 / 常见误区

溢出被静默忽略,不会触发异常
rd=x0 时结果丢弃(HINT 空间),不要指望 x0 存储运算结果
不要与 ADDI 混淆:ADD 两个操作数都是寄存器,ADDI 第二个是立即数

常见问题

ADD 会在溢出时产生异常吗?

不会。RISC-V 基础整数加法忽略算术溢出,软件需要自行用比较或分支序列检测溢出。

ADD 和 ADDI 应该怎么选?

两个操作数都在寄存器中时用 ADD;第二个操作数是 12 位有符号立即数时用 ADDI。