Assembly-调用函数后%o个寄存器的值
编写汇编代码时,在调用一个包含多个参数的函数后,是否所有的%o寄存器(除了%o0,因为它包含返回值)都设置为0? 例如: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,并传递给被调用方,该例程可以更改
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的系统上进行尝试。