assembly jal和jalr之间的RISC-V差异

oxalkeyp  于 2023-05-29  发布在  其他
关注(0)|答案(2)|浏览(825)

我在学习RISC-V汇编语言时遇到了名为jal和jalr的指令。
我很难理解日本航空和日本航空之间的区别。

jal x1, X

看起来上面的代码意味着跳转到X,并将通常为PC+4的返回地址保存到x1。
但是在那之后,jalr x0, 0(x1)来了。
0(x1)意味着返回到返回地址,但x 0是什么?
在RISC-V中,x 0基本上是零,那么为什么我们需要x 0呢?
这两个指令jaljalr之间的实际区别是什么?

mbjcgjjk

mbjcgjjk1#

正如我们在specification(第15页)中看到的,jaljalr之间的主要区别是地址值编码。
jal使用立即(20位)编码的目的地址,可以跳转+-1MiB范围。并将实际address + 4保存在寄存器rd中。(在您的示例中为x1)。
jalr使用间接地址(在您的示例中为x1)加上12位常量(在您的示例中为0)。它也将实际的address + 4保存在寄存器rd中。在您的示例中,您将x0设置为返回地址寄存器,因为您“不关心”。
例如,当你从子程序返回时,返回地址是无用的,那么我们设置x0

uurv41yg

uurv41yg2#

好的,我检查了RISC-V的手册:https://riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf
显然,jal使用J作为编码类型,而jalr使用I类型。在jalr中,x 0被用作目的地,因为结果不是必需的,我们只需要将控制权交还给调用程序(至少这是我的猜测)。
以下是手册中的文本:“间接跳转指令JALR(跳转和链接寄存器)使用I型编码。通过将12位带符号的I立即数加到寄存器rs 1,然后将结果的最低有效位设置为零来获得目标地址。跳转后的指令地址(pc+4)被写入寄存器rd。如果不需要结果,则可以将寄存器x 0用作目的地。

相关问题