首页/指令库/无符号字加
ADD.UW

RISC-V ADD.UW 指令详解

指令手册OP-32 (R-type)

无符号字加法(RV64),将rs1的低32位零扩展后与rs2相加

指令语法

add.uw rd, rs1, rs2

rd、rs1 选择 x0–x31;源读取写回前的值,写入 x0 被丢弃。

rs1 仅取低 32 位并零扩展;rs2 使用完整 64 位。

要求 RV64 Zba;保留加法结果低 64 位,不做字结果符号扩展。

Zba地址生成

指令行为说明

RV64 Zba:将 rs1[31:0] 零扩展后与 rs2 做 64 位加法,结果写入 rd。

ADD.UW 指令解析与执行动画

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

rd
rs1
rs2
add.uw
,
,
执行环境

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

t1(x6)
0x0000000000000014
a0(x10)
0x0000000000001000
31..25
24..20
19..15
14..12
11..7
6..0
0000100
funct7
01010
rs2
00110
rs1
000
funct3
00101
rd
0111011
opcode
执行数据路径
instruction
0x08A302BB
opcode
0111011 -> OP-32
funct3
000 -> ADD.UW
funct7
0000100 -> ADD.UW selector
rd / rs1 / rs2
t0(x5) / t1(x6)=0x0000000000000014 / a0(x10)=0x0000000000001000
rs1[31:0]
0x00000014 -> zero-extend = 0x0000000000000014
RV64 XLEN-wide add
尚未计算
x5
t0(x5) = 0x0000000000003001; pc = 0x0000000000002000
当前步骤

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

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

encoding: 0x08A302BB
syntax : add.uw t0(x5), t1(x6), a0(x10)
待提交结果: 尚未计算
当前架构状态
t0(x5) = 0x0000000000003001; pc = 0x0000000000002000

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

快速理解与检索要点

add.uw 常用于 RV64 地址生成:先把 rs1[31:0] 零扩展,再与 rs2 相加。

RV64 Zba:rs1 取低 32 位并零扩展,rs2 使用完整 64 位。
它是 Zba 地址生成位操作,不是普通 ADDW;结果不是 32 位符号扩展。

常见使用场景

地址与指针

RV64 Zba,x11=0xffffffff80000000、x12=1:零扩展 x11 低 32 位后相加,x10=0x0000000080000001。

类型转换

RV64 Zba,x11=0xffffffff80000000、x12=1:零扩展 x11 低 32 位后相加,x10=0x0000000080000001。

使用前检查清单

语法检查
  • rd、rs1 选择 x0–x31;源读取写回前的值,写入 x0 被丢弃。
  • rs1 仅取低 32 位并零扩展;rs2 使用完整 64 位。
语义检查
  • 要求 RV64 Zba;保留加法结果低 64 位,不做字结果符号扩展。

容易混淆 / 常见误区

仅适用于 RV64;RV32 没有该指令。
只有 rs1 的低 32 位被零扩展;rs2 作为 XLEN 宽加数参与。
add.uw rd, rs1, x0 可用于零扩展 32 位字,但 addiw 是符号扩展语义。

常见问题

add.uw 和 addw 有什么区别?

add.uw 零扩展 rs1 的低 32 位后与 rs2 做 XLEN 加法;addw 做 32 位加法并把 bit31 符号扩展到 XLEN。