了解程序语言在汇编级是如何执行的
cpu是如何维持堆栈的
堆栈:一个先进后出的结构
寄存器:一个cpu临时存储数据的地方,虽然存储空间小但是运行速度非常快
cpu不能直接进行例如加法、减法等运算操作,他必须将数据装入寄存器才能进行计算
EBP寄存器永远指向某一个函数栈帧的开始处
ESP寄存器永远指向一个函数栈帧的栈顶
栈从上向下生长
汇编中比较重要的的指令:
指针(c语言):
int x = 10;
int y = 20;
int *xp = &x;
int *yp = &y;
先来看看c语言的简单代码:
int demo(){
int x = 10;
int y = 20;
int sum = add(&x, &y);
printf("the sum is %d\n", sum);
return sum;
}
int add(int *xp, int *yp){
int x = *xp;
int y = *yp;
return x + y;
}
再看一下汇编代码:
汇编语言和机器语言几乎就是一一对应的关系,理解了汇编就可以简单理解我们编写的高级语言是如何在底层运行的了
栈从上向下生长:栈底在上面,栈顶在下面,堆从下向上生长
从上面的图片可以看出内存有两种分配方式:
静态分配(在栈上分配):
编译器在编译时就能确定大小
动态分配(在堆上分配):
在编译期无法确定大小
栈顶在下
程序中有很多函数帧,但是ebp和esp只有一套,他们就指向当前的函数帧,别的函数帧的ebp,esp应该存的数据只好先暂时保存到内存中(就是这个栈)
比如我们要push(ebp),就会将ebp中的值压入栈顶,于此同时esp的值会自动减4(即向下移动一个位置,因为esp永远指向栈顶)
先来看汇编代码的前两行:
假设在调用demo函数之前,ebp,esp指向函数帧2
pushl
