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

RISC-V SRLI 指令详解

指令手册I-type

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

指令语法

srli rd, rs1, shamt
操作数说明
rd:x0–x31;与源重叠时先读取旧源值,写入 x0 被丢弃。
shamt:RV32 为 0–31,RV64 为 0–63;其余立即数高位固定为零。
逻辑右移高位补零;rd 接收 XLEN 位结果。
RV32IRV64I算术运算移位

指令行为说明

SRLI 是 I-type 的逻辑右移立即数形式。它把 rs1 按 shamt 右移,高位补 0,低位移出的 bit 丢弃,结果写入 rd。RV32 的 shamt 为 imm[4:0],范围 0..31;RV64 使用 6 位 shamt,其中 bit25 表示 shamt[5]。opcode=0010011,funct3=101;固定高位/bit30=0 将 SRLI 与 SRAI 区分开。

SRLI 指令解析与执行动画

RV32I/RV64I; XLEN-bit logical right shift

srli rd, rs1, shamt

执行环境

假设取指成功、无异步中断及额外扩展检查;同名寄存器共用一份初值。

本例固定 IALIGN=32、指令长 32 位;PC 必须为 4 字节对齐。

32-位编码0x0025D513
fixed imm[11:5] [31..25]
0000000
shamt[4:0] [24..20]
00010
rs1 [19..15]
01011 → x11
funct3 [14..12]
101
rd [11..7]
01010 → x10
opcode [6..0]
0010011
x11=0x00000014; shamt=2
尚未计算

读取指令

解析当前指令字段并读取写回前源值;还没有提交结果。

x10=0x00000007; PC=0x00002000
当前架构状态(提交前)

这是架构效果的教学步骤,不代表处理器流水线或周期。

快速理解与检索要点

SRLI 使用 shamt 常数逻辑右移 rs1,高位补 0。它常用于无符号右移、字段提取或清除低位后的缩放。

opcode=0010011 且 funct3=101 选择右移立即数类,固定高位/bit30 决定 SRLI 还是 SRAI。
RV32 与 RV64 的 shamt 宽度不同;非法范围输入不会参与动画编码或计算。

常见使用场景

位操作与掩码

结合 «srli x5, x6, 8 # RV32I/RV64I: x6=0x1234 -> x5=0x12 (logical right shift)» 等实际代码理解该场景。

使用前检查清单

语法检查
  • rd、rs1 和可选 rs2 均为 x0–x31 或 ABI 名称;没有 rs3。
  • shamt 为 RV32 的 0–31 或 RV64 的 0–63,其余立即数高位固定为零。
语义检查
  • 将rs1逻辑右移shamt位(高位补零),结果写入rd
  • 重叠寄存器读取写回前源值;rd=x0 为 HINT,仅推进 PC 和适用性能计数器,实现可忽略。

容易混淆 / 常见误区

SRLI 高位始终补 0;需要保持符号时应看 SRAI。
shamt 是移位立即数字段:RV32 为 0..31,RV64 为 0..63。
rd=x0 是自定义 HINT;除推进 PC 和适用的性能计数器外,不改变架构可见状态,且实现可忽略它。

常见问题

SRLI 和 SRAI 只差一个 bit 吗?

在基础移位立即数编码中,它们共享 opcode 与 funct3;固定高位中的 bit30 为 0 选择 SRLI,为 1 选择 SRAI。

SRLI 的 shamt 能写负数吗?

不能。shamt 是非负移位量,RV32 范围 0..31,RV64 范围 0..63。