目标地址计算
JALR 使用 rs1 加符号扩展的 12 位立即数形成目标地址,并将目标地址最低位清零后跳转。
The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture, version 20260120, §2.5 Control Transfer Instructions将rs1与12位有符号立即数相加(结果最低位清零)作为目标地址跳转,同时将返回地址写入rd
JALR指令采用I型格式(opcode=1100111, funct3=000)。目标地址由rs1与12位有符号立即数相加后,最低位强制清零得到。同时将返回地址(PC+4)写入寄存器rd。rd=x0 时执行不保存返回地址的间接跳转;官方手册将普通无条件间接跳转的 JR 伪指令描述为 rd=x0 的 JALR。当rd=x0且rs1=x1且imm=0时即为函数返回(伪指令RET)。结果最低位清零的设计既简化硬件,也允许函数指针最低位存储辅助信息。rd和rs1为x1/x5时的组合为返回地址栈(RAS)提供隐式预测提示。
从机器码字段解析开始,依次展示操作数读取、该指令专属语义计算和 ISA 可见状态更新。
本例使用固定寄存器初值和初始 PC=0x2000;取指成功,没有异步中断或额外扩展检查。异常分支只显示普通提交停止,陷入后的 PC 和处理程序状态由 EEI 决定。
机器码按当前指令格式切成字段,动画从 encoding/decode 开始。
该动画展示 ISA 可见的解码和状态变化,不表示任何特定 CPU 的流水线、缓存、预测或时序实现。
JALR 是寄存器间接跳转并链接:目标地址由 rs1 加符号扩展的 12 位立即数得到,并在跳转前把最低位清零,同时把 pc+4 写入 rd。
以下要点按 RISC-V Unprivileged ISA 手册核准,用于补充操作语义、立即数范围和边界行为。
JALR 使用 rs1 加符号扩展的 12 位立即数形成目标地址,并将目标地址最低位清零后跳转。
The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture, version 20260120, §2.5 Control Transfer Instructions与 JAL 一样,JALR 将 pc+4 写入 rd。`ret` 伪指令通常展开为 `jalr x0, 0(ra)`,因此不会写链接寄存器。
The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture, version 20260120, §2.5 Control Transfer InstructionsRV32I/RV64I、IALIGN=32 示例:PC=0x2000、ra=0x3001 时,jalr x0, 0(ra) 成功跳到 0x3000;x0 保持为 0。
RV32I/RV64I、IALIGN=32 示例:PC=0x2000、ra=0x3001 时,jalr x0, 0(ra) 成功跳到 0x3000;x0 保持为 0。
官方手册说明这样可简化硬件,并允许函数指针最低位存储辅助信息。
标准返回形式是 jalr x0, 0(ra)。目标为原 ra 的最低位清零后的地址(ra & ~1);链接地址写入 x0 被丢弃。IALIGN=32 时目标还必须是 4 的倍数,否则引发指令地址未对齐异常。