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

RISC-V SD 指令详解

指令手册S-type

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

指令语法

sd rs2, offset(rs1)
操作数说明
rs2:RV64I 存储一个 64 位寄存器;RV32 Zilsd 要求偶数 rs2,低/高 32 位分别来自 rs2/rs2+1。
Zilsd 中奇数 rs2 编码保留;rs2=x0 时整个 64 位源为零,不读取 x1。
rs1 是基址;offset 为符号扩展的 12 位字节偏移,范围 -2048 到 2047;SD 不写通用寄存器。
RV64IZilsd内存存储

扩展条件:RV64I 使用单个 64 位 rs2;RV32 必须启用 Zilsd,使用偶数 rs2 指定寄存器对。

指令行为说明

SD 使用 32 位 S 型编码(opcode=0100011,funct3=011)。RV64I 将 rs2 的 64 位值写入 rs1 加符号扩展 12 位偏移处;地址计算按 XLEN 回绕。RV32 Zilsd 使用同一编码,要求偶数 rs2:rs2 保存低 32 位,rs2+1 保存高 32 位,与字节序无关;rs2=x0 时整个 64 位源值为零,不读取 x1。Zilsd 的 8 字节对齐访问不得引发地址未对齐异常,但双字访问不保证原子;地址为 4 的倍数时每个 word 访问必须原子,4 字节对齐但非 8 字节对齐时仍可陷入。

SD 指令解析与执行动画

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

rs2
imm
rs1
sd
,
(
)
执行环境

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

本例假定普通内存可写、采用小端序。成功访问存储低 64 位并推进 PC+4;不模拟一般访问权限、部分写入或设备副作用。非对齐异常不保证内存保持不变。

a0(x10)
0x0000000000001000
t0(x5)
0x0000000000003001
PC
0x0000000000002000

仅当有效地址不是 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
尚未计算
memory
pc = 0x0000000000002000; 尚未存储
当前步骤

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

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

encoding: 0x00553023
syntax : sd x5, 0(x10)
待提交结果: 尚未计算
当前架构状态
pc = 0x0000000000002000; 尚未存储

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

快速理解与检索要点

RV64I 的 SD 存储一个 64 位寄存器;RV32 Zilsd 的 SD 存储偶/奇寄存器对,不能混淆两种源值。

12 位有符号字节偏移范围为 -2048 到 2047;imm[11:5] 在 inst[31:25],imm[4:0] 在 inst[11:7]。
RV32 Zilsd 的奇数 rs2 编码保留;rs2=x0 特殊地提供整个 64 位零值。
RV64I 的非对齐访问由 EEI 定义;Zilsd 的双字不保证整体原子,分解访问可能出现部分写入。

常见使用场景

双字数据存储

SD 按本页的数据宽度把源值写入内存;先确认地址、区域权限及适用的 RV64I/Zilsd 条件。

RV32 Zilsd 寄存器对存储

SD 按本页的数据宽度把源值写入内存;先确认地址、区域权限及适用的 RV64I/Zilsd 条件。

使用前检查清单

语法检查
  • 使用 rs2, offset(rs1);12 位有符号字节偏移为 -2048 到 2047,拆分在 inst[31:25] 和 inst[11:7]。
语义检查
  • RV64I:将rs2的64位值存入内存;RV32 Zilsd:从偶/奇寄存器对存储64位值。
  • 区分 RV64I 单寄存器与 RV32 Zilsd 偶/奇寄存器对;Zilsd rs2=x0 提供整个 64 位零值。

容易混淆 / 常见误区

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

常见问题

SD 只在 RV64 上可用吗?

RV64I 定义单寄存器 SD。RV32 Zilsd 也定义同编码的 SD,但源是偶/奇寄存器对;动画仅演示 RV64I。