C.JAL

RISC-V C.JAL 指令详解

指令手册CJ format

RV32C 的 16 位 CJ 跳转:PC 加带符号字节偏移,x1 写入旧 PC+2。

指令语法

c.jal offset

RV32 C 2.0/Zca;16 位 CJ 格式,只有 offset 操作数,链接寄存器固定为 x1/ra。

offset 是 -2048 至 2046 的偶数字节偏移;分散字段拼接后 bit0=0,再按 12 位有符号值解释。

目标=旧 PC+offset;x1=旧 PC+2,地址按 32 位回绕。RV64 中相同编码位置为 C.ADDIW。

C压缩指令

指令行为说明

c.jal 是仅 RV32C 定义的 CJ 格式指令:将符号扩展的、2 字节对齐的 PC 相对 offset 加到 pc,并把 pc+2 写入 x1/ra。

C.JAL 指令解析与执行动画

仅展示手册定义的压缩字段、操作数和架构可见状态;不表示流水线、缓存或时序。

执行环境(RV32 C/Zca)
PC 0x00001000 -> 0x00001100; x1/ra <- 0x00001002
16 位编码字段
15..13
funct3
001
12
offset[11]
0
11
offset[4]
0
10..9
offset[9:8]
01
8
offset[10]
0
7
offset[6]
0
6
offset[7]
0
5..3
offset[3:1]
000
2
offset[5]
0
1..0
op
01
当前计算

imm[11:0]=000100000000 (bit0=0); sext12 -> 256 bytes; x1 fixed

提交步骤会显示架构可见结果。

快速理解与检索要点

c.jal 是仅 RV32C 定义的 CJ 格式指令:将符号扩展的、2 字节对齐的 PC 相对 offset 加到 pc,并把 pc+2 写入 x1/ra。

压缩指令通常对应一条 32 位基础指令语义,但有寄存器子集、立即数编码或 XLEN 限制。
C.JAL 只定义在 RV32C;RV64C 中相同编码位置用于 C.ADDIW。
链接寄存器固定为 x1/ra,不像 JAL 那样可选择 rd。

常见使用场景

短距离跳转并链接

RV32 C/Zca,旧 PC=0x1000:c.jal 256 得到 PC=0x1100、x1/ra=0x1002。

使用前检查清单

语法检查
  • RV32 C 2.0/Zca;16 位 CJ 格式,只有 offset 操作数,链接寄存器固定为 x1/ra。
  • offset 是 -2048 至 2046 的偶数字节偏移;分散字段拼接后 bit0=0,再按 12 位有符号值解释。
语义检查
  • 目标=旧 PC+offset;x1=旧 PC+2,地址按 32 位回绕。RV64 中相同编码位置为 C.ADDIW。

容易混淆 / 常见误区

C.JAL 只定义在 RV32C;RV64C 中相同编码位置用于 C.ADDIW。
链接寄存器固定为 x1/ra,不像 JAL 那样可选择 rd。

常见问题

为什么 c.jal 只在 RV32C 中定义?

官方 C 扩展把 C.JAL 定义为 RV32C 指令;在 RV64C 中相同编码空间用于 C.ADDIW。

c.jal 是否只是汇编伪指令?

不是。它是 C 扩展定义的 16 位编码指令。