函数栈帧的创建与销毁

用vs2013演示

一、局部变量是怎样创建的(大体逻辑一致,细节有差别)

    1. 寄存器

esp;ebp;eax;ebx;ecx

esp 和ebp,这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的

每一个函数调用,都要开辟空间,并且是在栈区

内存中为某函数开辟的空间,就称这块空间是为这个函数开辟的函数栈帧,esp(栈顶指针)指向头,ebp(栈底指针)指向尾——由低地址到高地址

两者之间的空间就是为这次函数调用开辟的空间

int main ()

{

int a=10;int b =20;

Add(x,y)

return 0;

}

调用main函数的过程

第一步push,即为压栈(给栈顶放一个元素),栈顶放了ebp里的值,并且esp指向的地址向上移了一位(pop从栈顶删除一个元素)

第二步move,把esp的值给ebp,则ebp指向最上面的位置

第三步sub,给esp减上0E4h,esp变小,指向上面某一块区域,为main函数预开辟好了空间,

这里就是main函数的函数栈帧

第四步,三次push,在顶上压了ebx,esp再往上走,重复压进esi、edi,esp又往上走了两位

第五步,将刚才为main函数开辟的空间的所有元素均初始化为CCCCCCC,即ebx和ebp之间的空间

第六步,开始从这片被初始化为CCCCCCC的空间里,从高地址往低地址放你要放的值,否则会使用初始化的随机值,对于vs编译器而言就是“烫烫烫”(使用printf的话),并且放值的空间之间差了两个整型

第七步,调用函数,eax压栈,里面放的是20,再把ebp-8的值放到ecx里面去,ecx压栈

调用call,放一个地址,下次调用再来这里

第八步,push ebp(往上走),给esp减去一个数,再为Add开辟空间,分配函数栈帧

——这就是在传参

往后循环往复,参数从右向左传

形参是实参的一份临时拷贝

返回的时候,先放进eax,z销毁,然后逐步回收空间,esp和ebp最后回到main函数中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值