caller-and-callee

原文出处

IA32平台的寄存器的使用约定

C/C++编译器遵守如下约定的规则

  • 当该函数是处于调用者角色时, 如果该函数执行过程中产生的临时数据会已存储在**%eax, %edx, %ecx这些寄存器中, 那么在其执行call指令之前会将这些寄存器的数据写入其栈帧内指定的内存区域, 这个过程叫做调用者保存约定(英文原名称: Caller Save)**.
  • 当该函数是处于被调用者角色时, 那么在其使用这些寄存器**%ebx, %esp, %edi之前, 那么该函数会保存这些寄存器中的信息到其栈帧指定的内存区域, 这个过程叫做被调用者保存约定**.
  • %eax总会被用作返回整数值.
  • %esp, %ebp总被分别用着指向当前栈帧的顶部和底部, 主要用于在当前函数推出时, 将它们还原为原始值.
  • 对于全栈角度来说, %esp也叫做整个栈的栈指针(Stack Pointer)
  • 对于某个函数的栈帧来说, %ebp也叫做该函数的帧指针(Frame Pointer)