您的位置:首页 > 其它

函数调用的具体过程以及栈帧的创建和销毁

2017-11-03 19:21 363 查看
这里用一个简单的Add加法程序讲解函数调用过程

#include <stdio.h>
#include <windows.h>
#include <assert.h>

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

int main()
{
int a = 1;
int b = 2;
int ret = 0;
ret = Add(a, b);
system("pause");
return 0;
}


先从主函数部分开始。

首先创建mainCRTStartup函数的栈帧。

esp栈顶指针减0E4(228),开辟了228字节大小空间。

接着又压入3个寄存器ebx、esi、edi

然后用下面代码把开辟的空间初始化为cc cc cc cc



接下来就是创建局部变量a,b,ret并赋值。

然后便开始传参

call调用Add函数,并且调用前保存了call指定的下一条指定的地址。

main函数





开始Add部分

刚开始也是一样为Add函数创建栈帧

接着创建z变量,赋值为0

把x放到eax中

把y也加到eax中

把eax放到z里面

Add到这就差不多结束了,开始return z,z放到eax里,把寄存器变量传回去;

pop出栈

Add函数

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: