我了解到jal
和jalr
都可以用于调用函数,相反,只有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
调用。