目标地址计算
JALR 使用 rs1 加符号扩展的 12 位立即数形成目标地址,并将目标地址最低位清零后跳转。
RISC-V Unprivileged ISA, RV32I control transfer instructions将rs1与12位有符号立即数相加(结果最低位清零)作为目标地址跳转,同时将返回地址写入rd
JALR 使用 opcode 1100111(0x67)、funct3 000。rs1 字段选择源寄存器,12 位立即数提供第二操作数,rd 选择目标寄存器。
JALR指令采用I型格式(opcode=1100111, funct3=000)。目标地址由rs1与12位有符号立即数相加后,最低位强制清零得到。同时将返回地址(PC+4)写入寄存器rd。当rd=x0时即为间接跳转(伪指令JR);当rd=x0且rs1=x1且imm=0时即为函数返回(伪指令RET)。结果最低位清零的设计既简化硬件,也允许函数指针最低位存储辅助信息。rd和rs1为x1/x5时的组合为返回地址栈(RAS)提供隐式预测提示。
JALR 是寄存器间接跳转并链接:目标地址由 rs1 加符号扩展的 12 位立即数得到,并在跳转前把最低位清零,同时把 pc+4 写入 rd。
以下要点按 RISC-V Unprivileged ISA 手册核准,用于补充操作语义、立即数范围和边界行为。
JALR 使用 rs1 加符号扩展的 12 位立即数形成目标地址,并将目标地址最低位清零后跳转。
RISC-V Unprivileged ISA, RV32I control transfer instructions与 JAL 一样,JALR 将 pc+4 写入 rd。`ret` 伪指令通常展开为 `jalr x0, 0(ra)`,因此不会写链接寄存器。
RISC-V Unprivileged ISA, RV32I control transfer instructions使用 jal ra, label 或 jalr ra, rs, imm。
结合 «jalr x1, 0(x5) # jump to x5, x1 = pc+4» 等实际代码理解该场景。
官方手册说明这样可简化硬件,并允许函数指针最低位存储辅助信息。
常见返回形式是 jalr x0, 0(ra),也就是不写返回地址、跳转到 ra 指向的位置。