Assembly-调用函数后%o个寄存器的值

Assembly-调用函数后%o个寄存器的值,assembly,return-value,sparc,Assembly,Return Value,Sparc,编写汇编代码时,在调用一个包含多个参数的函数后,是否所有的%o寄存器(除了%o0,因为它包含返回值)都设置为0? 例如: mov %i0, %o0 mov %i1, %o1 mov %i2, %o2 call somefunction nop 根据上面的代码!o1和o2现在是否自动设置为零?简而言之,寄存器的值不会更改或自动设置为0 假设通过save指令(或其他方式)创建了新的堆栈帧,则传递到%o0到%o5寄存器的参数将变为%i0到%i5,并传递给被调用方,该例程可以更改

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

例如:

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

根据上面的代码!o1和o2现在是否自动设置为零?

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

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

因此,当寄存器窗口恢复时,甚至不能保证您在%ox寄存器中输入的值会被保留,因为被调用方可能已经更改了它们

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

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

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


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

我认为在函数调用后,您不能依靠
o1-o5
来包含任何特定值。它们应该被认为是不稳定的,如果你需要保存它们或者让它们包含一个特定的值,你需要自己处理。但是,如果您想确定您应该参考Sparc ABI文档,或者更好,可以在实际的基于Sparc的系统上进行尝试。