我了解到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的内存位置。如果要防止jal x0, sum3寄存器被破坏,只需考虑将子例程作为call sum3而不是ra调用。

10-06 16:17