x86 Assembly/Registers

x86 Assembly/Registers

寄存器惯例

函数调用

在 X64 (X86_64) 汇编里,过程调用(函数)参数按顺序分别用 rdi,rsi,rdx,rcx,r8,r9。返回值用 rax。

更多的参数需要借助堆栈传递。X86 通用寄存器较少,一般所有参数均使用堆栈。

寄存器值保存

x86 / X64 采用了一组统一的寄存器使用惯例,所有的过程调用都必须遵守。

  • 由调用者保存的寄存器:%r10, %r11 (以及:6个用作参数的寄存器、返回值寄存器 %rax)
  • 由被调用者保存的寄存器:%rbx, %r12-%r15 (以及:堆栈地址寄存器 %rbp 和 %rsp)
int P()
{
    int x = f(); /* Some computation */
    Q();
    return x;
}

过程 P 希望它计算出来的 x 值在调用了 Q 之后仍然有效,则:

  • 如果 x 放在一个调用者保存寄存器中, 而 P (调用者)必须在调用Q之前保存这个值, 并在 Q 返回之后恢复该值.
  • 如果 x 在一个被调用者保存寄存器中, Q (被调用者)想使用这个寄存器, 那么 Q 在使用这个寄存器之前, 必须保存这个值, 并在返回前恢复它.

在这两种情况中, 保存(通常)就是将寄存器的值压入栈中, 而恢复是指从栈中弹出到寄存器中。


Last update: 2018-06-15 08:22:44 UTC