汇编语言要使用内存,C语言以及其他语言也要使用内存空间;
CPU访问寄存器的速度大于访问内存的速度;
所有语言最大的区别是对内存的使用;
内存模型:编译器在内存中安排数据的存放。
本文用c语言写一段代码,然后进行debug调试,看看C语言中的局部变量,全局变量如何在内存中存放。
汇编变量和C变量的比较
c语言定义变量如下:
int main()
{
int a=1; // x
int b = 2; // y
}
对应的汇编语言定义:
data segment
a dw 1 ;x
b dw 2 ;y
data ends
可以看出:
- C中的a和汇编中的a一样,都是内存的偏移地址;
- C语言中的int 对应的汇编中dw,表示数据的长度;
- C中的变量值和汇编dw后面的值。
可以看出C语言更加贴近人的思维,更方便。
汇编程序和C程序的比较
下面 分析一段程序,C程序如下:
int a1,a2,a3;
void f(void);
main()
{
int b1,b2,b3;
a1 = 0xa1;
a2 = 0xa2;
a3 = 0xa3;
b1 = 0xb1;
b2 = 0xb2;
b3 = 0xb3;
f();
}
void f(void)
{
int c1,c2,c3;
a1 = 0x0fa1;
a2 = 0x0fa2;
a3 = 0x0fa3;
c1 = 0xc1;
c2 = 0xc2;
c3 = 0xc3;
}
上边的代码,经过编译后生成test.exe;然后在dos窗口下进行debug。
先找到Main函数的入口地址:1fa;
不明白sub sp,6
是什么目的?
开始查看a1,a2,a3是如何在内存中存放的?
程序往下单步执行,可以看到a1存放的位置是,ds段中的,ds:01a6
然后,执行完a2和a3的命令,并查看ds:01a6,可以看到a1,a2,a3在数据段中是连续存放的,
再来观察一下,sub sp,06
前后,sp指针的变化。执行前sp = ffd8
,执行后sp=ffd2
,sp的地址减少了6,相当于增长了6个内存空间,如下图所示。问题是,这6个空间是什么用途呢?
程序继续往下执行,
从上图可以看到,原来申请出来的6个空间是存放局部变量的。局部变量b1 ,b2 ,b3分别存入了栈中,而栈是一段临时的空间,这就是为什么函数中的局部变量是临时的。
继续执行,直到程序执行完毕,可以看到sp又回到了程序执行之前的值,这就实现了高级语言的**“内存回收”**机制。