首页/指令库/存储双字
SD

RISC-V SD 指令详解

指令手册S-type

RV64I:将rs2的64位值存入内存;RV32 Zilsd:从偶/奇寄存器对存储64位值。

指令语法

sd rs2, offset(rs1)
操作数说明
源寄存器 rs2:要写入内存的数据寄存器。
基址寄存器 rs1:内存访问的基地址。
立即数偏移:12 位有符号偏移量,与 rs1 相加得到最终地址。
RV64IZilsd内存存储

指令行为说明

SD 指令在 RV64I 中采用 S 型格式(opcode=0100011, funct3=011),将 rs2 的低 64 位存到 rs1 加符号扩展 12 位偏移量处。在 RV32 的 Zilsd 扩展中,同一助记符/编码表示“从寄存器对存储双字”:64 位值来自 rs2 和 rs2+1,且 rs2 必须为偶数。Zilsd 的 8 字节自然对齐访问不得引发地址未对齐异常,但内存访问不一定原子;有效地址为 4 的倍数时,每个 word 访问必须原子,且仍可产生未对齐陷入。

SD 指令解析与执行动画

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

rs2
imm
rs1
sd
,
(
)
执行环境
a0(x10)
0x0000000000001000

仅当有效地址不是 8 的倍数时使用此 EEI 分支;自然对齐访问不得引发地址未对齐异常。

31..25
24..20
19..15
14..12
11..7
6..0
0000000
imm[11:5]
00101
rs2
01010
rs1
011
funct3
00000
imm[4:0]
0100011
opcode
执行数据路径
instruction
0x00553023
opcode
0100011 -> STORE
funct3
011 -> SD
rs2 / base
t0(x5)=0x0000000000003001 / a0(x10)=0x0000000000001000
S-imm
imm[11:5]|imm[4:0] -> 0; ea=0x0000000000001000 (naturally aligned (8-byte))
store data
select low 64 bits -> 0x0000000000003001
memory
mem[0x0000000000001000] = 0x0000000000003001
当前步骤

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

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

encoding: 0x00553023
syntax : sd t0(x5), 0(a0(x10))
result : mem[0x0000000000001000] = 0x0000000000003001
架构可见结果
mem[0x0000000000001000] = 0x0000000000003001

该 SD 动画只建模 RV64I 的单寄存器 64 位存储;RV32 Zilsd 使用同一助记符和编码但操作偶/奇寄存器对,其独立条件见静态页面内容。

常见使用场景

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» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认存储源 rs2 与基址 rs1 寄存器。
  • 确认立即数偏置(imm[11:5] | imm[4:0])正确拆分。
语义检查
  • 确认目标内存地址对齐要求。
  • 确认写入不会破坏调用约定保存的寄存器。

容易混淆 / 常见误区

RV64I 语义是单个 64 位寄存器存储;RV32 Zilsd 语义是偶/奇寄存器对存储。
Zilsd 中 rs2 必须为偶数;奇数 rs2 编码为保留。
偏移量为符号扩展 12 位;最可移植的是 8 字节自然对齐访问。