Assembly MIPS:在嵌套过程中保存返回地址

Assembly MIPS:在嵌套过程中保存返回地址,assembly,mips,Assembly,Mips,假设我有: 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中,但在执行jal function_b时,function_a会覆盖$ra,因此

假设我有:

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中,但在执行jal function_b时,function_a会覆盖$ra,因此显然需要在某个时候保存$ra。但我找不到任何东西能真正说明公约是怎么做的。调用
jal function\u b
之前,是否在函数a中的堆栈上存储$ra?在调用
jal function_b
之前,我是否将$ra存储在s寄存器中,然后将该s寄存器保存在function_b的开头(我认为这是隐含的)?有什么不同的吗?这有关系吗?

通常的做法是直接在堆栈上保存
$ra
。将其存储在(比如)
$s0
中没有多大意义,因为根据正常的调用约定
函数a
也必须保存
$s0
,因此首先必须在堆栈上保存
$s0
,为
$ra
腾出空间。当然,如果你不遵守正常的通话惯例,你可以做任何你想做的事情