函数的调用过程(栈帧)

来源:互联网 发布:电影票售票系统 java 编辑:程序博客网 时间:2024/05/21 11:09

拿一段简单的代码为例:

#include <stdio.h>

int Add(int x,int y )
{
int z = 0;
z = x+y; 
return z;
}

int main()
{
int a = 10;
int b = 20;
int c = 0;
c = Add(a,b);
printf("%d \n",c);
return 0;
}

程序调试的时候,查看调用堆栈:


不难发现:main函数在__tmainCRTStartup函数中调用;而__tmainCRTStartup函数是在mainCRTstartup中被调用。

栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。——“来自搜狗百科”

那么调用main函数,分配栈帧空间,栈帧维护如下:

接下来,有了这些铺垫,我对应汇编代码来说明:

1.先从main函数开始:



2.传参



接着执行call指令按F11:

再按F11:

进入Add函数:



接下来是返回部分:




最后,将30带回给c。

如有误,欢迎朋友们指出!







原创粉丝点击