一.首先认识由c/c++编译的程序占用的内存有哪些部分:
1.其中堆区与栈区是相对而生的。(之后研究栈帧会将栈区单独列出来)
2.在程序运行期间,地址空间区是一直存在的,程序退出,地址空间也随即释放。
二.其次需要认识一个数据结构以及两个汇编命令。
1.认识一个数据结构:栈。
栈有栈底和栈顶,是一种“先进后出”的结构。
2. 两个汇编命令:push和pop
从栈顶入栈称为push
从栈底出栈称为pop
其中入栈和出栈都是在同一位置进行的。
三.接下来了解CPU中需要用到的一些寄存器。
在CPU中:读取指令(内存-->CPU)-->分析指令(CPU)-->执行指令(CPU)
1. 通用寄存器:EAX 、EBX 、ECX 、EDX
2. EIP(pc):程序计数器(用来存放当前正在执行指令的下一条指令的地址)
3. ESP:栈顶
4. EBP:栈底
四.现在开始研究栈帧。
1. 研究栈帧,接下来会将其从地址空间里面单独列出。
2. 在VC6.0下通过此代码研究栈帧:
#include <stdio.h>
#include <windows.h>
int myadd(int a,int b)
{
int c = a+b;
return c;
}
int main()
{
int a = 0xAAAAAAAA;
int b = 0xBBBBBBBB;
int ret = myadd(a,b);
printf("%d\n",ret);
system("pause");
return 0;
}
3. 现在要做的是:Fn+F11进行调试,然后将其转换成汇编语言,打开寄存器和内存。
main()函数
(1)进入main(),首先会根据该函数内部临时变量的大小为它开辟空间(也就是 main的栈帧)
(2) 开始对main()进行一系列操作