首页/指令库/立即数逻辑右移
SRLI

RISC-V SRLI 指令详解

指令手册I-type

将rs1逻辑右移shamt位(高位补零),结果写入rd

指令语法

srli 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

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

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

指令行为说明

SRLI指令属于I型格式的特化子类(opcode=0010011, funct3=101, funct7=0000000)。rs1按移位量shamt(立即数字段低5位)进行逻辑右移,高位补零,低位丢弃,结果写入rd。对于RV32I,funct7的bit30=0(6位funct7编码为0000000),与SRAI的区别即bit30的值。

快速理解与检索要点

SRLI 执行立即数逻辑右移,高位补 0,结果写入 rd。移位量来自 shamt 立即数字段。

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

常见使用场景

乘法与除法

结合 «srli x5, x6, 2 # x5 = x6 >> 2 (unsigned divide by 4)» 等实际代码理解该场景。

特定用途

结合 «srli x5, x6, 2 # x5 = x6 >> 2 (unsigned divide by 4)» 等实际代码理解该场景。

类型转换

结合 «srli x5, x6, 2 # x5 = x6 >> 2 (unsigned divide by 4)» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

高位始终补零(与SRAI的区别)
bit30必须为0,否则被解码为SRAI

常见问题

SRLI 的移位量来自哪里?

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

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

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