首页/指令库/存储半字
SH

RISC-V SH 指令详解

指令手册S-type

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

指令语法

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

指令行为说明

SH指令采用S型格式(opcode=0100011, funct3=001)。有效地址由rs1与12位有符号偏移相加得到,将rs2寄存器的低16位写入该地址。自然对齐的半字地址应为2的倍数。

SH 指令解析与执行动画

以 ADDI 页面同样的节奏展示:机器码字段解析、固定字段识别、操作数读取、指令专属语义计算和 ISA 可见状态更新。

rs2
imm
rs1
sh
,
(
)
执行环境
31..25
24..20
19..15
14..12
11..7
6..0
0000000
imm[11:5]
00101
rs2
01010
rs1
001
funct3
00000
imm[4:0]
0100011
opcode
执行数据路径
instruction
0x00551023
opcode
0100011 -> STORE
funct3
001 -> SH
rs2 / base
t0(x5)=0x00003001 / a0(x10)=0x00001000
S-imm
imm[11:5]|imm[4:0] -> 0; ea=0x00001000
store data
select low 16 bits -> 0x00003001
memory
mem[0x00001000] = 0x00003001
当前步骤

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

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

encoding: 0x00551023
syntax : sh t0(x5), 0(a0(x10))
result : mem[0x00001000] = 0x00003001

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

快速理解与检索要点

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

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

常见使用场景

数据存储

结合 «sh x6, 2(x10) # mem[x10+2][15:0] = x6[15:0]» 等实际代码理解该场景。

数组与内存访问

结合 «sh x6, 2(x10) # mem[x10+2][15:0] = x6[15:0]» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 S-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

仅写入rs2的低16位
自然对齐要求地址为2的倍数

常见问题

SH 会写整个寄存器吗?

SH 只写 rs2 的低 16 位半字,不是总是写完整 XLEN 宽寄存器。

store 指令的地址怎么计算?

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