查看数据在内存中存储结构的方法
查看数据在内存中存储结构的方法,科学论坛,
杨金花 约2704字
【摘要】:该文详细叙述了汇编语言中用数据定义伪指令实现的数据存储,其查看内存中数据存储结构的方法。
【关键词】:数据定义;伪指令;数据存储结构; 查看方法
中图分类号:TP3文献标识码:A文章编号:1002-6908(2007)1010038-01 《汇编语言程序
》课程,是计算机专业课程中比较难学的一门专业基础课。课程中所讲的理论很抽象。在以往的教学过程中,教师全凭一张嘴描述概念、教授知识。学生看不到内存的实际
,学起来难以建立正确的概念,普遍感到困难、枯燥。时间长了,对该课程产生了抵触情绪,在学习的过程中也就缺少兴趣和动力。要改变这种情况,就得想办法把知识直观化。
在《汇编语言程序设计》课程中,数据定义伪指令,是数据段构成的主要指令,每个汇编语言程序都离不开数据段。数据定义伪指令实现的数据在内存中的存储顺序结构,关系到程序运算的结果值。因此它在《汇编语言程序设计》课程,显得非常重要。数据定义伪指令在计算机内存中,到底形成了怎样的存储顺序。为了让学生快速、正确的掌握这一知识点,我们萌生了借助一定的手段,把数据定义伪指令实现的实际顺序结构让学生看清楚的想法。在多年的教学探索中,对汇编语言数据定义伪指令实现的数据在内存中存储的实际情况查看方法进行了研究,有了一定的心得和方法。
针对参考程序中的数据段,想出了解决这一问
的较巧妙的方法:就是把需查看的数据定义伪指令写入数据段,再加上一小段代码段,
CODE SEGNENT;定义代码段
ASSUNE CS:CODE,DS:DATA;每一个段指定段寄存器,程序中只有两个段 START:MOVAX,DATA;将数据段的段地址值送给AX 寄存器
CODE END;代码段结束
END START;整个程序结束
(这一代码段主要是与写成的数据段形成程序,并给数据段的段寄存器送段地址。汇编语言程序,至少应该有数据段和代码段。)接着进行汇编、链接操作,生成执行汇编、链接操作,生成可执行文件。然后用DEBUG软件查看程序的数据段在内存中的存储顺序。 例如:我们想知道下面几条数据定义伪指令实现的内存中数据分配情况。从理论上分析。 c1 DW '3A',3AH;
c1符号
示第一个数据41H所在的存储单元地址,定义了两个数据,没有用ORG指令
,数据是从偏移地址0000H开始分配,字符串定义为字时,有低字节、高字节之分,'A'是低字节,'3'是高字节,且字符在内存中存储时,是存储的字符的ASC?码,应该为41H、33H。十六进制数据3AH,只是一个字节,而定义为字,因此高字节为00H。存储的数据是3AH,00H。
c2CB2 DUP(3,'A'),'3AH',-7;
c2符号表示第一个数据03H所在的存储单元地址,数据为字节,第一个定义是括号内的数据,转换为十六进制数03H,存储字符'A'的ASC?码41H,将03H、41H重复两遍存储,字符串'3AH'存储为33H、41H、48H、-7存储负数的补码F9H。 c3=$-C1;
用"="或EQU定义符号,符号只有值,并不分配存储单元,$表示当前最后一次分配的存储单元的下一个存储单元。两个地址相减,值为两个地址之间的数据个数。 c4 DW c1+2,$-c1,'3A';
c4 符号表示第一个数据02H所在的存储单元地址。C1是存储单元的地址,加上2后,其值
仍是一个地址,$-C1是当前存储单元到C1单元之间的数据个数,字符'3A'实现的存储顺序为41H、33H。
ORG 20;
定义以下的第一个数的偏移地址为十进制20,既十六进制0014H
c5 DD c1+2,$-c1,-7,'3A' C5表示第一个数据所在的存储单元地址,C1是地址,加上2后仍是地址,定义为双字,前两个字节是地址的偏移地址,后两个字节是地址的段地址,$-c1是两个地址之间的数据个数,且为双字,占四个存储单元,-7存储的是其的补码F9H,将其的符号扩展为三个字节,全为FFH,字符'3A'存储为41H、33H、00H、00H
为了证明我讲的理论是对的,按上面介绍的方法,把数据定义伪指令写成数据段如下:改写为:DATA SEGMENT
c1 DW '3A',3Ah
c2 DB2DUP(3,'A'),'3AH',-7
c3 =$-C1
c4 DW c1+2,$-c1,'3A'
DATAENDS
程序写成:DATA SEGMENT
c1 DW '3A',3AH
c1 DW '3A',3AH
c2 DB 2DUP(3,'A'),'3AH',-7
c3 =$-c1
c4 DW c1+2,$-c1,'3A'
c5 DD c1+2,$-c1,-7,'3A'
DATA ENDS
CODE SEGNENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
CODE ENDS
ENDSTART
我们在EDIT软件中输入上面的程序,并存盘,用MASM软件进行汇编上面的助记符程序。用LINK软件进行链接,生成可执行文件。接着下来用DEBUG软件查看数据段的数据,在内存中的分配顺序情况。其操作的方法是:第一步,从键盘上输入命令;DEBUG[盘符:][路径]〈文件名:EXE〉;第二步,从键盘输入DEBUG的U命令,查看数据段的段地址;第三步,从键盘输入DEBUG的D命令,查看数据段的数据在内存中的D命令,查看数据段的数据在内存中的分配顺序,对照自己的理解是否正确;第四步,从键盘输入DEBUG的Q命令退出 通过上面介绍的方法,我们可以看到各种数据定义伪指令实现的数据在内存中存储顺序,以及数据所在的存储单元的段地址、偏移地址。可以得出以下结论:
1.字符在内存中存储时是存储的字符的ACS?码;
2.数据在内存中存储时是存储的数据的十六进制形式;
3.字符串以字节形式存储时,是从字符串的左端第一个字符开始存储,一个字符的ASC?码就是一个字节;
4.字符串以字形式存储时,有高低字节之分,右边的字符是低字节,左边字符是高字节; 5.地址定义为字数据,存储的是地址的偏移地址,地址定义为双字数据,较低的两个字节是
地址的偏移地址,较高的两个字节是地址的段地址。
参考文献
[1] 杜法则,汇编语言程序设计,北京:中国物资出版社,1998. [2] 杨秀文等,80X86汇编语言程序设计教程,北京:清华大学出版社,1998. [3] 邓洪涛,386/486汇编语言精要,北京:清华大学出版社,1995. [4] 朱慧真,汇编语言教程,北京:国防工业出版社,1988.