由于使用编译器为vs2013,该电脑未配备,无代码演示
1.寄存器:eax,ebx,ecx,edx ebp,esp
ebp,esp这2个寄存器中存放的是地址,这两个地址是用来函数栈帧的
每一个函数调用都要在栈上开辟空间,开辟的空间被称为函数栈帧,由ebp(栈低指针),esp(栈顶指针)维护
栈区的使用习惯是先使用高地址在使用低地址,
在VS2013中main函数的调用逻辑,
3.main
2.__tmainCRTStartup
1.mainCRTStartup、
压栈(push):在顶上指针放进去一个元素;出栈(pop):从顶上指针拿走一个元素;
此时esp,ebp之间的空间是.__tmainCRTStartup函数的空间,接下来要进行main函数栈帧的创建
1.首先要进行一个push压栈把ebp压入函数栈帧使esp向上移动一格,
2.进行mov操作把esp地址放入ebp中
3.进行sub减法操作,把esp的值减去0E4h,esp往上移,指向一个新地址,
4.在压三个元素ebx, esi,edi,esp往上走
5.lea(load effective address加载有效地址):在edi中加载一个地址
6.mov:ecx,39h,把39h放到ecx寄存器中;
7.mov;eax,0CCCCCCCh,从ecx到eax初始化成0CCCCCCCh;
main函数预开辟的空间全部是ccc
把结果放在eax中进行保存,eax不会销毁它是寄存器;
esp,ebp之间的空间就是为函数预开辟的空间;
函数调用的函数栈帧创建
函数每次调用的时候都会重复执行上述步骤;压栈
函数调用时候的参数是从右向左传;
形参是实参的一份临时拷贝;
call调用函数,把下一条指令的地址压进栈
函数栈帧的销毁
进行三次pop操作弹出edi,esi,ebx三个变量;
eax将结果带回,esp,ebp之间的空间没有存在的必要,进行回收;
采用move指令,将ebp的地址放入esp中;
pop ebp调用结束;