基础知识介绍和引入
//不同的编译器下,函数调用过程中栈帧的创建是略有差异的
栈区下面是高地址,上面是低地址;
在调用时,栈区是从高地址向低地址使用的
//
寄存器:集成到CPU上
ebp、esp这两个寄存器中存放的是地址
这两个地址是用来维护函数栈帧的
调用哪个函数就维护哪个栈帧
每一个函数调用,都要在栈区创建一个空间,称这块空间为函数的函数栈帧
ebp存了这块空间的高地址,称ebp为栈低指针
esp存了这块空间的低地址,称esp为栈顶地址
在VS2013中,main函数也是被其他函数调用的
//push:压栈:在栈顶放一个元素
//pop:出栈:从栈顶删除一个元素
引入:
代码:
1.
为main函数创建空间
push ebp:压栈
在栈顶部放一个值ebp
然后esp向上移动一位
mov ebp,esp
mov a,b:
把后面b的值赋给前面的a
sub esp,0E4h
把esp减去十六进制的0E4h
esp地址变小,指向上面
紫色部分就是为main函数预开辟的空间
lea edi ,[ebp-0E4h]
load effective address:
加载有效地址
将[ebp-0E4h]这个地址放入edi中
lea edi ,[ebp-0E4h]
mov ecx,39h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
word占两个字节,dword:double word占四个字节
rep stos dword ptr es:[edi]
意思是:把从edi 向下到 39h之前的所有地址的编号改为0CCCCCCCCh
2.
创建局部变量
int a = 10;
mov dword ptr [ebp-8],0Ah
把0Ah赋给[ebp-8]
//此处的8单位是字节
已知:一个地址占四个字节
[ebp-8]就是ebp向上两个地址的位置
//
如果不初始化a,那么在[ebp-8]这块空间存储的就是0CCCCCCCCh
这也就是为什么有时候在打印时会打印出随机值或者烫烫烫烫
int b = 20;
mov dword ptr [ebp-14h],14h
int c = 0;
mov dword ptr [ebp-20h],0