0

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

例如:

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

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

4

1 回答 1

2

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

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

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

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

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

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

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

于 2013-06-29T17:47:58.950 回答