C.JALR

RISC-V C.JALR 指令详解

指令手册C-type

RV32/RV64:目标为旧 x[rs1] 清零 bit0,链接 x1=PC+2;rs1=x0 的编码是 C.EBREAK。

指令语法

c.jalr rs1
操作数说明
RV32/RV64,C 2.0 或 Zca;16 位 CR 格式。
完整五位 rs1 选 x1–x31;rs2 字段固定为零,无显式立即数。
目标为旧 x[rs1] 清零 bit0,x1/ra 接收旧 PC+2。rs1=x0 选择 C.EBREAK,不执行此跳转或链接。
C压缩指令

指令行为说明

C.JALR(C 2.0 / Zca,CR)用完整五位rs1选择x1–x31,rs2固定零。目标为旧x[rs1]清零bit0;旧PC+2写x1/ra,即使rs1=x1也先读旧值。与jalr x1, 0(rs1)的区别是链接PC+2而非PC+4。rs1=x0为C.EBREAK,不执行此跳转或链接。

C.JALR 压缩编码学习实验

从 16 位字段出发,连接压缩约束、基础指令语义与最终可见状态。

c.jalr
跳转前
PC = 0x0000000000001000, x1 = 0x0000000000002001
架构结果
PC = 0x0000000000002000; x1 = 0x0000000000001002

RV32C/RV64C / Zca; IALIGN=16;本例未由外部调试环境覆盖 C.EBREAK。

16 位编码与字段职责

15..12
1001
funct4
11..7
00001
rs1 -> x1
6..2
00000
fixed rs2
1..0
10
C2

可见计算过程

x[rs1]
0x0000000000002001
& ~1
new PC
0x0000000000002000
PC
0x0000000000001000
+ 2
x1 / ra
0x0000000000001002

目标 PC 清除 bit 0,链接地址使用压缩指令长度 2 字节。

控制流路径

CR 字段
1001 00001 00000 10
目标规范化
x[rs1] & ~1 -> 0x0000000000002000
基础语义对照
jalr x1, 0(x1)
链接与跳转提交
pc <- 0x0000000000002000; x1/ra <- 0x0000000000001002
尚未提交架构状态。

快速理解与检索要点

RV32/RV64:目标为旧 x[rs1] 清零 bit0,链接 x1=PC+2;rs1=x0 的编码是 C.EBREAK。

CR:funct4=1001,rs1=[11:7],rs2=[6:2]=00000,op=10。
C 扩展允许 IALIGN=16;清除 bit0 后的目标满足指令对齐,不产生指令地址未对齐异常。

常见使用场景

函数调用与返回

RV32/RV64,旧 ra=0x2001、PC=0x1000:c.jalr ra 得到 PC=0x2000、ra=0x1002;目标使用旧 ra。

使用前检查清单

语法检查
  • RV32/RV64,C 2.0 或 Zca;16 位 CR 格式。
  • 完整五位 rs1 选 x1–x31;rs2 字段固定为零,无显式立即数。
语义检查
  • 目标为旧 x[rs1] 清零 bit0,x1/ra 接收旧 PC+2。rs1=x0 选择 C.EBREAK,不执行此跳转或链接。

容易混淆 / 常见误区

rs1不能为x0(该编码为 C.EBREAK)
跳转目标按 JALR 规则清零最低位;链接地址是 pc+2

常见问题

rs1=ra 会先覆盖跳转目标吗?

不会。使用旧 ra 算目标,再写链接。例如旧 ra=0x2001、PC=0x1000,得到 PC=0x2000、ra=0x1002。

rs1=x0 是普通跳转吗?

不是。该码点是 C.EBREAK。若外部调试环境未覆盖其行为,则触发断点异常,不执行 C.JALR 的跳转或链接。