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