汇编 - 调用函数后%o的值

时间:2013-06-13 06:51:43

标签: assembly return-value sparc

编写汇编代码时,调用带有多个参数的函数后,是否所有%o寄存器(%o0除外,因为它包含返回值)设置为0?

例如:

mov    %i0, %o0
mov    %i1, %o1
mov    %i2, %o2
call   somefunction
nop

从上面的代码中,!是o1和o2现在自动设置为零?

1 个答案:

答案 0 :(得分:2)

简而言之,寄存器的值不会自动更改或设置为0。

假设通过保存指令(或其他方法)创建了新的堆栈帧,传递给%o0到%o5寄存器的参数变为%i0到%i5到被调用者,并且该例程可以更改这些寄存器值。

因此,当恢复寄存器窗口时,您甚至无法保证在%ox寄存器中放置的值会被保留,因为被调用者可能已经更改了它们。

请记住,out寄存器成为被调用者的寄存器。这就是被调用者将返回值放在%i0中并恢复寄存器窗口的原因。然后返回调用者,返回值为%o0。

对于叶子例程也是如此。但是,在这种情况下,例程只能访问%o0到%o5寄存器来执行其工作。

从任一例程返回时,%ox寄存器的内容将是剩下的内容。

此外,%o6和%o7分别保存堆栈指针和程序计数器的地址。