编写汇编代码时,在调用一个带有多个参数的函数后,所有的%o 寄存器(除了 %o0 因为它包含返回值)是否都设置为 0?
例如:
mov %i0, %o0
mov %i1, %o1
mov %i2, %o2
call somefunction
nop
从上面的代码,!o1 和 o2 现在是否自动设置为零?
编写汇编代码时,在调用一个带有多个参数的函数后,所有的%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 分别保存堆栈指针和程序计数器的地址。