首页/指令库/存储字节
SB

RISC-V SB 指令详解

指令手册S-type

将rs2的低8位存储到内存指定地址

指令语法

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

指令行为说明

SB 使用 32 位 S 型编码(opcode=0100011,funct3=000),将 rs2 的低 8 位写入内存。有效字节地址为 rs1 加符号扩展的 12 位偏移,按 XLEN 回绕;偏移范围为 -2048 到 2047。imm[11:5] 位于 inst[31:25],imm[4:0] 位于 inst[11:7]。字节访问始终自然对齐。

SB 指令解析与执行动画

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

rs2
imm
rs1
sb
,
(
)
执行环境

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

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

a0(x10)
0x00001000
t0(x5)
0x00003001
PC
0x00002000

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

31..25
24..20
19..15
14..12
11..7
6..0
0000000
imm[11:5]
00101
rs2
01010
rs1
000
funct3
00000
imm[4:0]
0100011
opcode
执行数据路径
instruction
0x00550023
opcode
0100011 -> STORE
funct3
000 -> SB
rs2 / base
t0(x5)=0x00003001 / a0(x10)=0x00001000
S-imm
imm[11:5]|imm[4:0] -> 0; ea=0x00001000 (naturally aligned (1-byte))
store data
尚未计算
memory
pc = 0x00002000; 尚未存储
当前步骤

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

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

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

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

快速理解与检索要点

SB 使用 rs1 加 12 位有符号偏移形成有效地址,并把 rs2 的低 8 位字节写入内存。

S-type 立即数被拆分在指令字的两个字段中,但语义上仍是一个 12 位有符号字节偏移。
存储指令不写 rd;写入宽度由 SB/SH/SW 决定。

常见使用场景

字节数据存储

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

使用前检查清单

语法检查
  • 使用 rs2, offset(rs1);12 位有符号字节偏移为 -2048 到 2047,拆分在 inst[31:25] 和 inst[11:7]。
语义检查
  • 将rs2的低8位存储到内存指定地址
  • 地址计算按 XLEN 回绕;不写通用寄存器。字节访问总是自然对齐,半字的非对齐结果由 EEI 定义。

容易混淆 / 常见误区

只写 rs2 的低 8 位;不写通用寄存器。
字节地址始终自然对齐,但仍须满足区域访问权限和支持条件。

常见问题

SB 会写整个寄存器吗?

SB 只写 rs2 的低 8 位字节,不是总是写完整 XLEN 宽寄存器。

store 指令的地址怎么计算?

有效地址由基址寄存器 rs1 加符号扩展的 12 位字节偏移得到。