0

假设我有:

main:

    // stuff

    jal function_a

function_a:

    // function_a stuff

    jal function_b

    jr $ra

function_b:

    // function_b stuff

    jr $ra

据我了解,main 在执行 jal function_a 时会将适当的返回地址保存在 $ra 中,但随后 function_a 在执行 jal function_b 时会覆盖 $ra,因此显然需要在某个时候保存 $ra。但我找不到任何真正说明惯例是做什么的东西。在调用之前,我是否在 function_a 中将 $ra 存储在堆栈中jal function_b?我是否在调用之前将 $ra 存储在 s-register 中jal function_b,然后将该 s-register 保存在 function_b 的开头(我认为这里暗示了这一点)?有些不同?有关系吗?

4

1 回答 1

1

通常的做法是$ra直接保存在堆栈上。将它存储在 (say)$s0中没有多大意义,因为根据正常的调用约定,function_a还必须保存$s0,所以首先你必须保存$s0在堆栈上为$ra. 如果您不遵循正常的调用约定,那么您当然可以做任何您想做的事情。

于 2013-10-26T22:12:03.687 回答