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?
jal
和 jalr
这两个指令之间的实际区别是什么?
正如我们在 specification(第 15 页)中看到的,jal
和 jalr
之间的主要区别是地址值编码。
jal
对目标地址使用立即数(20 位)编码,并且可以跳转 +-1MiB 范围。并将实际的address + 4
保存在寄存器rd
中。 (x1
在你的例子中)。
jalr
使用间接地址(在您的示例中为 x1
)加上一个 12 位常量(在您的示例中为 0)。它也将实际的 address + 4
保存在寄存器 rd
中。在您的示例中,您将 x0
设置为 return 地址寄存器,因为您“不关心”。
例如,当您从子程序中 return 时,return 地址没有用,那么我们设置 x0
。
我在学习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?
jal
和 jalr
这两个指令之间的实际区别是什么?
正如我们在 specification(第 15 页)中看到的,jal
和 jalr
之间的主要区别是地址值编码。
jal
对目标地址使用立即数(20 位)编码,并且可以跳转 +-1MiB 范围。并将实际的address + 4
保存在寄存器rd
中。 (x1
在你的例子中)。
jalr
使用间接地址(在您的示例中为 x1
)加上一个 12 位常量(在您的示例中为 0)。它也将实际的 address + 4
保存在寄存器 rd
中。在您的示例中,您将 x0
设置为 return 地址寄存器,因为您“不关心”。
例如,当您从子程序中 return 时,return 地址没有用,那么我们设置 x0
。