编写汇编代码时,调用带有多个参数的函数后,是否所有%o寄存器(%o0除外,因为它包含返回值)设置为0?
例如:
mov %i0, %o0
mov %i1, %o1
mov %i2, %o2
call somefunction
nop
从上面的代码中,!是o1和o2现在自动设置为零?
答案 0 :(得分:2)
简而言之,寄存器的值不会自动更改或设置为0。
假设通过保存指令(或其他方法)创建了新的堆栈帧,传递给%o0到%o5寄存器的参数变为%i0到%i5到被调用者,并且该例程可以更改这些寄存器值。
因此,当恢复寄存器窗口时,您甚至无法保证在%ox寄存器中放置的值会被保留,因为被调用者可能已经更改了它们。
请记住,out寄存器成为被调用者的寄存器。这就是被调用者将返回值放在%i0中并恢复寄存器窗口的原因。然后返回调用者,返回值为%o0。
对于叶子例程也是如此。但是,在这种情况下,例程只能访问%o0到%o5寄存器来执行其工作。
从任一例程返回时,%ox寄存器的内容将是剩下的内容。
此外,%o6和%o7分别保存堆栈指针和程序计数器的地址。