IA32(俗称x86)采用了一组统一的寄存器使用惯例., 所有的过程调用都必须遵守, 包括程序库中的过程.
看例子:
yoo:
…
movq $15213, **%rdx**
call who a
ddq **%rdx**, %rax …
ret
who:
…
subq $18213, **%rdx**
…
ret
深入了解计算机系统P173说得很清楚。
P里边的保存x使用的寄存器%rdi,在调用Q的时候也要使用,所以为了不覆盖,我们可以继续使用%rdi,但是必须要把%rdi里边的值,先放到一个空间,所以我们push,即保存这个值进入栈里边,这个时候有了备份,就可以修改这个寄存器了。同时,在调用函数结束的时候,要把这个值pop出来。
本文介绍了IA32架构中寄存器的使用惯例,特别是%rdi寄存器在过程调用中的作用。通过具体示例展示了如何在调用过程中避免寄存器值被覆盖,并解释了为何需要使用栈来保存寄存器值。
2228

被折叠的 条评论
为什么被折叠?



