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出来。