我在学习RISC-V汇编语言时遇到了名为jal和jalr的指令。
我很难理解jal和jalr之间的区别。
jal x1, X
上面的代码似乎意味着跳转到X,并将通常为PC + 4的返回地址保存到x1。
但是之后,jalr x0, 0(x1)
来了。
0(x1)
意味着要返回到返回地址,但x0是什么?
在RISC-V中,基本上x0为零,
那我们为什么需要x0?
这两个指令jal
和jalr
之间的实际区别是什么?
谢谢。
答案 0 :(得分:4)
我们在specification(第15页)中看到,jal
和jalr
之间的主要区别是地址值编码。
jal
对目标地址使用立即(20位)编码,并且可以跳过+ -1MiB范围。并将实际的address + 4
保存在寄存器rd
中。 (在您的示例中为x1
)。
jalr
使用间接地址(在您的示例中为x1
)加上12位常量(在您的示例中为0)。它将实际的address + 4
保存在寄存器rd
中。在您的示例中,您将x0
设置为返回地址寄存器是因为您“不在乎”。
例如,当您从子例程返回时,返回地址没有用,那么我们设置x0
。