算术溢出行为
整数加法结果只保留低 XLEN 位;算术溢出不会触发异常。需要检测溢出时,应由软件用额外比较或分支序列完成。
RISC-V Unprivileged ISA, RV32I integer computational instructions将rs1与rs2相加,结果写入rd
ADD 使用 opcode 0110011(0x33)、funct3 000、funct7 0000000。rs1 和 rs2 字段选择两个源寄存器,rd 字段选择目标寄存器。
ADD指令采用R型格式。将rs1和rs2寄存器的值相加(算术溢出忽略,仅保留低XLEN位),结果写入rd。funct7=0000000, funct3=000。这是RISC-V中最基本的算术运算指令。ADD与ADDI配合实现基址+偏移的地址计算。
ADD 是寄存器到寄存器的整数加法。官方 RV32I 语义是把 rs1 与 rs2 相加并写入 rd,算术溢出不会产生异常,结果按 XLEN 宽度截断。
以下要点按 RISC-V Unprivileged ISA 手册核准,用于补充操作语义、立即数范围和边界行为。
整数加法结果只保留低 XLEN 位;算术溢出不会触发异常。需要检测溢出时,应由软件用额外比较或分支序列完成。
RISC-V Unprivileged ISA, RV32I integer computational instructionsADD 是 R-type 指令,两个源操作数都来自寄存器 rs1 和 rs2,结果写入 rd。立即数加法应使用 ADDI。
RISC-V Unprivileged ISA, RV32I integer computational instructionsADD 使用两个寄存器操作数(rs1 + rs2),而 ADDI 使用一个寄存器和一个 12 位有符号立即数(rs1 + imm)。ADD 是 R-type 指令(opcode 0110011),ADDI 是 I-type 指令(opcode 0010011)。若需要加一个不在 -2048~2047 范围内的常数,应先通过 LUI+ADDI 将其加载到临时寄存器,再使用 ADD。
ADD 和 SUB 都是 R-type 指令,共享相同的 opcode (0110011) 和 funct3 (000)。二者的区别仅在于 funct7 字段:ADD 的 funct7 = 0000000,SUB 的 funct7 = 0100000。也就是说,SUB 实际上是通过 funct7 的最高位(bit30)来区分的——该位为 0 时执行加法,为 1 时执行减法。RISC-V 这样设计是为了简化解码逻辑,避免浪费额外的 opcode 空间。
结合 «add x5, x6, x7 # x5 = x6 + x7» 等实际代码理解该场景。
结合 «add x5, x6, x7 # x5 = x6 + x7» 等实际代码理解该场景。
结合 «add x5, x6, x7 # x5 = x6 + x7» 等实际代码理解该场景。
不会。RISC-V 基础整数加法忽略算术溢出,软件需要自行用比较或分支序列检测溢出。
两个操作数都在寄存器中时用 ADD;第二个操作数是 12 位有符号立即数时用 ADDI。