jal 和 jalr 的 RISC-V 区别

jwk*_*koo 9 riscv

我在学习 RISC-V 汇编语言时遇到了名为 jal 和 jalr 的指令。

我很难理解 jal 和 jalr 之间的区别。

jal x1, X 
Run Code Online (Sandbox Code Playgroud)

上面代码的意思好像是跳转到X,把正常情况下PC+4的返回地址保存到x1。

但在那之后,jalr x0, 0(x1)来了。

0(x1) 意味着回到返回地址的地址,但x0是什么?

本质上,RISC-V 中的 x0 为零,

那么为什么我们需要x0?

是什么这两个指令之间的实际差异,jaljalr

谢谢你。

Fab*_*enM 12

正如我们在规范(第 15 页)中看到的那样,jal和之间的主要区别在于jalr地址值编码。

jal对目标地址使用立即数(20 位)编码,并且可以跳转 +-1MiB 范围。并将实际保存address + 4在 register 中rd。(x1在你的例子中)。

jalr使用间接地址(x1在您的示例中)加上一个 12 位的常量(在您的示例中为 0)。它也将实际保存address + 4在寄存器中rd。在您的示例中,您设置x0为返回地址寄存器,因为您“不在乎”。

例如,当您从子程序返回时,返回地址没有用,那么我们设置x0.