用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函数中