汇编语言 使用内存空间


汇编语言 使用内存空间


在上一个实验我们已经知道,c语言使用寄存器需要我们给出相应寄存器的名称,在函数执行过程中就能一一对应。 
下面,我们来研究c语言如何使用内存空间: 
我们已经知道像偏移地址2000h中写入一个字节的内容,我们用如下方法:

  1. *(char *)0x2000=’a’;
  2. 2000:0写入一个字节用如下方法:
  3. *(char far *)0x20000000=’a’;



有了上面两点知识下面进行试验:

1、编写一个程序um1.c

技术分享

编译、链接生成.exe文件,然后用debug加载,对main函数代码进行分析

技术分享
我们可以找到相应的c代码对应的汇编语言

下面进行单步跟踪:将cs置为0d6c ip置为01fa 
技术分享
技术分享

我们可以在相应的地方找到赋给的值 
接下来的几条指令也跟上面类似

2、编一个程序,用一条c语言实现在屏幕中央显示一个绿色的字符‘a’

技术分享

图中的0b8000000 表示显示器的第一个地址 后面加的表示12行 中间地址 
02表示属性为绿色,61表示字符‘a’。 
技术分享

3、分析下面的汇编代码

技术分享

编译、链接用debug加载查看相应的汇编代码 
技术分享
从上面图片代码中,我们很容易知道,c语言将全局变量放在ds:[01A6]的数据段中,并且越先开始定义的数据存放的地址比后面定义的数据要低,上面a1的偏移地址小于a2,而a2又小于a3。 
从最后两条指令可以看出,c语言将局部变量存放在栈段中,并且按照定义变量的顺序,从栈顶向下依是b1,b2,b3,可以这样讲,先定义哪个变量,哪个变量就越放在栈中地址低的地方,即越靠近栈顶。 
至于push bp mov bp,sp 这两条指令,其实我们在前面的学习中已经接触过了,目的是为了保护这些返回程序需要的值,因为在后面用到栈的时候可能会破坏bp的值。

4、分析下面的程序的汇编代码,思考相关问题

技术分享
编译、链接用debug加载相应的exe文件 
技术分享
首先看到调用子程序call 020a命令,找到020a地址 看里面对应的程序,我们不难发现代码中使用了ax寄存器,我们就不难猜想,c语言将返回值存放在AX中。

5、下面理解malloc函数的用法

技术分享
我们学习c语言可以知道malloc函数的用法 
malloc(size); 
malloc 向系统申请分配指定size个字节的内存空间。 
现在我们来分析该程序, 

第一行、表示malloc向内存申请空间时从0200:0000地址开始申请,这个空间使我们程序员可以用的安全空间 
第四行、表示用malloc申请20个类型为char的空间,即20个字节 
第五行、表示在buffer的基地址上加十,即从申请的第十个地址开始,赋值为零。 


下面整个while循环是为了给buffer[0]到buffer[7]赋值‘a’-‘h’ 
Buffer[10]是充当计数器的作用,首先这个计数器为0,把地址Buffer中赋(61h+0)值,然后计数器加1,再把(61h+1)赋给地址Buffer+1,这样依次循环,使得Buffer[0]到Buffer[7] 依次存放‘a’’b’’c’…’h’。

@yujin753 2015-02-28 22:43 字数 1228 阅读 0
正在加载文章图片,请稍等片刻...

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。