gpt4 book ai didi

assembly - 为什么从子程序返回时使用 JALR 而不是 JAL

转载 作者:行者123 更新时间:2023-12-02 19:21:59 25 4
gpt4 key购买 nike

我了解到jaljalr都可以用于调用函数,相反只有jal可以用于返回来自这样的函数:

sum3:

add a0, a0, a1
add a0, a0, a2
jalr x0, 0(ra)

但是,此代码使用 jal 而不是 jalr 从函数返回,并且效果良好:

    call sum3
ret_sum3:
# following instructions
# ...
sum3:

add a0, a0, a1
add a0, a0, a2
jal x0, ret_sum3

既然如此,为什么说jalr是函数返回指令呢?我也可以使用 jal 来实现这一点。

最佳答案

您可能忽略的一点是,一般来说,函数或子例程应该能够从代码中的不同位置调用(即,对分布在代码中的子例程进行多次调用),因此应该是也能够返回到代码中的不同位置。

jal 指令跳转到的地址由 pc 寄存器的内容加上指令中编码的 21 位常量偏移量确定。因此,使用jal返回的子例程仅限于返回相同(相对于pc固定)的地址。

<小时/>

jal 仍可用于子程序返回吗?

如果您的子例程仅从代码中的单个位置调用,它仍然可以使用 jal 返回其调用者 - 前提是返回地址对应于大约位于 的内存位置距离用于返回的jal指令±1MB。如果您想防止 ra 寄存器被破坏,只需考虑将子例程调用为 jal x0, sum3 而不是 call sum3。 >

关于assembly - 为什么从子程序返回时使用 JALR 而不是 JAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59909196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com