首页/指令库/算术右移
SRA

RISC-V SRA 指令详解

指令手册R-type

将rs1按rs2的低log2(XLEN)位算术右移(高位用原符号位填充),结果写入rd

指令语法

sra rd, rs1, rs2
操作数说明
rd:选择 x0–x31;rd 与源重叠时使用写回前的源值;写入 x0 被丢弃。
rs2:只用 RV32 的低 5 位或 RV64 的低 6 位给出移位量。
算术右移复制 rs1 的原最高位;RV32 为 bit31,RV64 为 bit63。
RV32IRV64I算术运算移位

指令行为说明

SRA 指令采用 R-type 格式,将 rs1 按 rs2 低 log2(XLEN) 位给出的移位量算术右移:RV32 使用 rs2[4:0],RV64 使用 rs2[5:0]。高位用 rs1 的原最高位填充,低位移出的 bit 丢弃,结果写入 rd。opcode=0110011,funct3=101,funct7=0100000;同一 funct3 下 funct7=0000000 选择 SRL。

SRA 指令解析与执行动画

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

rd
rs1
rs2
sra
,
,
执行环境

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

a6(x16)
0xFFFFFFF0
sp(x2)
0x00000002
31..25
24..20
19..15
14..12
11..7
6..0
0100000
funct7
00010
rs2
10000
rs1
101
funct3
00101
rd
0110011
opcode
执行数据路径
instruction
0x402852B3
opcode
0110011 -> OP
funct3
101 -> SRA
funct7
0100000 -> base ALU selector
rd / rs1 / rs2
t0(x5) / a6(x16) / sp(x2)
shamt
rs2 low 5 bits -> 2
ALU
尚未计算
x5
t0(x5) = 0x00003001; pc = 0x00002000
当前步骤

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

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

encoding: 0x402852B3
syntax : sra t0(x5), a6(x16), sp(x2)
待提交结果: 尚未计算
当前架构状态
t0(x5) = 0x00003001; pc = 0x00002000

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

快速理解与检索要点

SRA 将 rs1 算术右移,用原最高位填充新高位。负数右移按 2 的幂除法向负无穷取整,不等同于 DIV 朝零截断。

opcode=0110011、funct3=101、funct7=0100000 选择 SRA。
寄存器移位量仍只取 rs2 的低 log2(XLEN) 位;算术性体现在右移补入原最高位。

常见使用场景

位操作

结合 «sra x5, x6, x7 # x5 = x6 >> (x7[4:0] on RV32, x7[5:0] on RV64) (arithmetic)» 等实际代码理解该场景。

类型转换

结合 «sra x5, x6, x7 # x5 = x6 >> (x7[4:0] on RV32, x7[5:0] on RV64) (arithmetic)» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 寄存器选择 x0–x31;重叠操作数读取写回前的值。
  • 该 R-type 形式没有立即数;SRA 只使用 rs2 的有效低位。
语义检查
  • 比较的有符号/无符号解释与算术右移的符号填充须符合本指令定义。
  • rd=x0 为 HINT,不改变通用寄存器;SRAI 的 x0,x0,7 为 semihosting 退出标记。

容易混淆 / 常见误区

SRA 复制 rs1 的原最高位;它不同于高位补 0 的 SRL。
例如 -3 算术右移 1 位得到 -2,而 DIV 将 -3 除以 2 得到 -1;不能无条件替代 DIV。
rd=x0 时 SRA 是预留给未来标准用途的 HINT,不执行普通目标寄存器更新。

常见问题

SRA 和 SRL 的编码差异是什么?

二者共享 opcode=0110011 和 funct3=101;SRA 使用 funct7=0100000,SRL 使用 funct7=0000000。

SRA 能直接替代有符号除法吗?

不能无条件替代。算术右移复制符号位:-3 右移 1 位得到 -2;RISC-V DIV 的 -3 / 2 朝零截断得到 -1。