汇编语言 使用内存空间
在上一个实验我们已经知道,c语言使用寄存器需要我们给出相应寄存器的名称,在函数执行过程中就能一一对应。
下面,我们来研究c语言如何使用内存空间:
我们已经知道像偏移地址2000h中写入一个字节的内容,我们用如下方法:
*(char *)0x2000=’a’;
像2000:0写入一个字节用如下方法:
*(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