汇编语言_探索C语言内存

汇编语言要使用内存,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又回到了程序执行之前的值,这就实现了高级语言的**“内存回收”**机制。
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值