首页/指令库/立即数算术右移
SRAI

RISC-V SRAI 指令详解

指令手册I-type

将rs1算术右移shamt位(高位用原符号位填充),结果写入rd

指令语法

srai rd, rs1, shamt
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数所在的寄存器。
立即数 imm:12 位有符号立即数,符号扩展后与 rs1 进行运算。
RV32I算术运算移位

指令编码

31..20
imm[11:0]
19..15
rs1
14..12
funct3
11..7
rd
6..0
opcode

SRAI 使用 opcode 0010011(0x13)、funct3 101、funct7 0100000。rs1 字段选择源寄存器,12 位立即数提供第二操作数,rd 选择目标寄存器。

格式: I-type
opcode: 0010011 (0x13)
funct3: 101 (0x5)
funct7: 0100000 (0x20)

指令行为说明

SRAI指令属于I型格式的特化子类(opcode=0010011, funct3=101, funct7=0100000)。rs1按移位量shamt进行算术右移:高位用rs1的原符号位(bit31)填充以保持符号不变,低位移出的位丢弃,结果写入rd。funct7的bit30=1(编码为0100000),正是这一点与SRLI区分开来。用于有符号整数除以2的幂次。

快速理解与检索要点

SRAI 执行立即数算术右移,高位复制原符号位,结果写入 rd。移位量来自 shamt 立即数字段。

RV32I 立即数移位的移位量编码在 5 位 shamt 中。
逻辑右移补 0;算术右移复制符号位,二者用于不同的有符号/无符号场景。

常见使用场景

乘法与除法

结合 «srai x5, x6, 2 # x5 = x6 >> 2 (signed, sign-extended)» 等实际代码理解该场景。

位操作与掩码

结合 «srai x5, x6, 2 # x5 = x6 >> 2 (signed, sign-extended)» 等实际代码理解该场景。

类型转换

结合 «srai x5, x6, 2 # x5 = x6 >> 2 (signed, sign-extended)» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

bit30必须为1(funct7=0100000),否则解码为SRLI
算术右移等效于向下取整除法(截断方向与整数除法的截断朝零不同)
对于RV32I,移位量只取立即数的低5位

常见问题

SRAI 的移位量来自哪里?

立即数版本的移位量来自 shamt 字段;RV32I 中是 5 位。

逻辑右移和算术右移有什么区别?

逻辑右移高位补 0;算术右移高位复制原符号位,通常用于保持有符号数的符号。