RV32 / RV64
看懂 RV32 和 RV64 的核心差异
聚焦寄存器宽度、load/store 行为、32-bit 运算指令和指针读写,帮助初学者快速避开最常见的误解。
核心差异速查表
6 个最关键的对比维度,一眼看清。
| 对比维度 / Comparison | RV32 | RV64 |
|---|---|---|
| 寄存器宽度 | 32 位 | 64 位 |
| 常见 ABI 数据模型 | ILP32:int/long/指针通常 4 字节 | LP64:long/指针通常 8 字节 |
| lw 行为 | 读取 32 位值,结果宽度仍为 32 位 | 读取 32 位值并符号扩展到 64 位 |
| 常见指针读取 | lw rd, offset(rs1) | ld rd, offset(rs1) |
| 常见指针存储 | sw rs2, offset(rs1) | sd rs2, offset(rs1) |
| RV64 32 位 word 运算 | add, sub, sll… | addw, subw, sllw… (w 后缀) |
重点对比
RV32
# 32 位加法add a0, a1, a2 # 32 位加法RV64
# XLEN 位加法(RV64 为 64 位)add a0, a1, a2 # XLEN 位加法(RV64 为 64 位)# 低 32 位相加,结果符号扩展到 64 位addw a0, a1, a2 # 低 32 位相加,结果符号扩展到 64 位# 低 32 位加立即数,结果符号扩展addiw a0, a1, 1 # 低 32 位加立即数,结果符号扩展易踩坑: RV64 下 add 是 XLEN 位运算;如果要表达 32 位 int/word 结果语义,用 addw/addiw。不要把 addw 用作普通 64 位指针地址计算。
RV32
# t0 = 从内存读取的 32 位值lw t0, 0(sp) # t0 = 从内存读取的 32 位值RV64
# t0 = 符号扩展(32 位 → 64 位)lw t0, 0(sp) # t0 = 符号扩展(32 位 → 64 位)# t0 = 零扩展(32 位 → 64 位)lwu t0, 0(sp) # t0 = 零扩展(32 位 → 64 位)易踩坑: lw 在 RV64 下会自动把 bit31 复制到高 32 位。如果期望高位全为 0,请改用 lwu(load word unsigned)。
RV32
# 读一个 32 位指针/地址lw t0, 0(sp) # 读一个 32 位指针/地址# 存一个 32 位指针/地址sw t0, 0(sp) # 存一个 32 位指针/地址RV64
# 读一个 64 位指针/地址ld t0, 0(sp) # 读一个 64 位指针/地址# 存一个 64 位指针/地址sd t0, 0(sp) # 存一个 64 位指针/地址易踩坑: 在常见 ILP32/LP64 psABI 数据模型下,RV32 指针通常为 4 字节,RV64 指针通常为 8 字节。RV64 上 lw 只读 4 字节并符号扩展,不能替代 ld 读取 64 位指针。
继续查阅
官方规范来源
本页参考以下官方 RISC-V 文档组织架构、ABI、CSR 和伪指令说明;平台或操作系统 ABI 差异仍需按对应规范核验。