函数调用中栈帧变化情况详解(汇编指令分析)
转载请注明出处,谢谢
现假设在函数A中调用函数B,调用一个函数时,压栈操作顺序为
-
压参数,顺序为从右往左压。
-
压返回地址
-
压old ebp,即保存A函数的栈底指针,此时才进入B函数的栈帧
-
开辟局部变量空间
-
保存相关寄存器的值
现在我们根据下面的代码来分析
gcd(int a, int b)为一个递归函数,递归条件为传入的参数b不为0,相应的基线条件为传入的参数b为0.
这里作一个简要的说明,每个递归函数都有两个部分:基线条件和递归条件。
基线条件为递归函数不再调用自己,递归条件为函数调用自己的条件。int gcd(int a,int b) { if(!b) { return a; } return gcd(a,a%b); }
现在我们在main()函数中调用gcd(int a, int b)函数
int main()
{
int a = gcd(18,5);
return 0;
}
代码的运行环境为VC++6.0,在int a=gcd(18,5)处设置断点
我们再来看以下程序栈和各个寄存器的值,观察call stackÿ