RISC-V jal 和 jalr 的区别

RISC-V difference between jal and jalr

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

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

jal x1, X 

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

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

0(x1)表示回到return地址,但是x0是什么?

在 RISC-V 中 x0 本质上是零,那么我们为什么需要 x0?

jaljalr 这两个指令之间的实际区别是什么?

正如我们在 specification(第 15 页)中看到的,jaljalr 之间的主要区别是地址值编码。

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

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

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