指令编码
31..25
imm[11:5]
24..20
rs2
19..15
rs1
14..12
funct3
11..7
imm[4:0]
6..0
opcode
SD 使用 opcode 0100011(0x23)、funct3 011。rs1 保存基地址,rs2 保存存储数据,12 位立即数(拆分在 imm[11:5] 和 imm[4:0])提供偏移量。
格式: S-type
opcode: 0100011 (0x23)
funct3: 011 (0x3)
指令行为说明
SD 指令在 RV64I 中采用 S 型格式(opcode=0100011, funct3=011),将 rs2 的 64 位值存到 rs1 加符号扩展 12 位偏移量处。在 RV32 的 Zilsd 扩展中,同一助记符/编码表示“从寄存器对存储双字”:64 位值来自 rs2 和 rs2+1,且 rs2 必须为偶数。自然对齐地址为 8 字节倍数;Zilsd 中 4 字节对齐但非 8 字节对齐的访问可拆为两个原子 word 访问,并仍可能产生 misaligned trap。
常见使用场景
RV64专用操作
结合 «sd x10, 24(x2) # store 64-bit value to stack at offset 24» 等实际代码理解该场景。
数据存储
结合 «sd x10, 24(x2) # store 64-bit value to stack at offset 24» 等实际代码理解该场景。
使用前检查清单
语法检查
- 确认当前指令格式为 S-type。
- 确认操作数排列顺序与示例一致。
语义检查
- 确认目标寄存器用途和调用约定兼容。
- 确认该指令不是伪指令展开后的底层形式。
容易混淆 / 常见误区
RV64I 语义是单个 64 位寄存器存储;RV32 Zilsd 语义是偶/奇寄存器对存储。
Zilsd 中 rs2 必须为偶数;奇数 rs2 编码为保留。
偏移量为符号扩展 12 位;最可移植的是 8 字节自然对齐访问。