rs1=ra 会先覆盖跳转目标吗?
不会。使用旧 ra 算目标,再写链接。例如旧 ra=0x2001、PC=0x1000,得到 PC=0x2000、ra=0x1002。
RV32/RV64:目标为旧 x[rs1] 清零 bit0,链接 x1=PC+2;rs1=x0 的编码是 C.EBREAK。
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,不执行此跳转或链接。
从 16 位字段出发,连接压缩约束、基础指令语义与最终可见状态。
PC = 0x0000000000001000, x1 = 0x0000000000002001PC = 0x0000000000002000; x1 = 0x0000000000001002RV32C/RV64C / Zca; IALIGN=16;本例未由外部调试环境覆盖 C.EBREAK。
16 位编码与字段职责
可见计算过程
目标 PC 清除 bit 0,链接地址使用压缩指令长度 2 字节。
控制流路径
1001 00001 00000 10x[rs1] & ~1 -> 0x0000000000002000jalr x1, 0(x1)pc <- 0x0000000000002000; x1/ra <- 0x0000000000001002RV32/RV64:目标为旧 x[rs1] 清零 bit0,链接 x1=PC+2;rs1=x0 的编码是 C.EBREAK。
RV32/RV64,旧 ra=0x2001、PC=0x1000:c.jalr ra 得到 PC=0x2000、ra=0x1002;目标使用旧 ra。
不会。使用旧 ra 算目标,再写链接。例如旧 ra=0x2001、PC=0x1000,得到 PC=0x2000、ra=0x1002。
不是。该码点是 C.EBREAK。若外部调试环境未覆盖其行为,则触发断点异常,不执行 C.JALR 的跳转或链接。