x86栈帧布局简记
2008-01-24 01:27
虽然不用汇编做开发,但在C/C++中定位一些core问题时需要查看堆栈结构,所以对堆栈布局要有一个基本的了解,但长期不接触就又忘了,因此在这里做个简记,以备用到的时候可以快速记起。
当函数P调用函数Q时,Q的参数是放在P的帧中的,且P中的下一条指令地址将被压入栈中,形成P的栈帧的末尾。Q的栈帧从保存帧指针的位置开始,后面开始保存其他寄存器的值。大多数信息的访问都是相对于帧指针(%ebp)的。如果函数要返回整数或指针的话,常用寄存器%eax来保存返回值。
在x86平台下,根据惯例,寄存器%eax、%edx、%ecx被划分为调用者保存。当函数P(调用者)调用Q(被调用者)时,Q可以覆盖这些寄存器的值,而不会破坏任何P所需要的数据。另外,%ebx、%esi、%edi、%ebp被划分为被调用者保存,这意味着Q必须在覆盖他们之前,将这些寄存器的值保存到栈中,并在返回前恢复他们。
|