汇编程序 读入一个文本文件并以DEBUG中的D命令格式显示.docx
- 文档编号:29880628
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:23
- 大小:494.98KB
汇编程序 读入一个文本文件并以DEBUG中的D命令格式显示.docx
《汇编程序 读入一个文本文件并以DEBUG中的D命令格式显示.docx》由会员分享,可在线阅读,更多相关《汇编程序 读入一个文本文件并以DEBUG中的D命令格式显示.docx(23页珍藏版)》请在冰豆网上搜索。
汇编程序读入一个文本文件并以DEBUG中的D命令格式显示
1.题目
读入一个文本文件并以DEBUG中的D命令格式显示
2.程序总体设计方案、思路
本程序是读入一个文本文件并以DEBUG中的D命令格式显示。
操作环境是32位的windowsXP系统,使用CmasmW软件(本人使用Masm软件,操作环境是64位WINDOWS7)进行汇编。
本程序要求以DEBUG中的D命令格式显示一个文本文件,文件名从键盘键入,大体思路为打开相应文件,读文件至程序缓冲区,并按照要求显示,以下是我本次课程设计的详细方案、思路:
本程序要求用D命令格式显示内容,使用DEBUG中的D命令格式显示一个文本文件时,显示寄存器中的内容大致为:
段地址、偏移地址、ASCII码部分(每个字节的值都用ASCII码表示)和字符显示部分(将ASCII码转化为字符显示),每个非打印字符(无效的字符)在显示时用“.”表示,每行显示16个字节的内容,第8个字节和第9个字节之间有一个连接字符“-”。
每个显示行从16字节的边界上开始。
程序主要由两大块组成,第一块是文件的获取,包括键入、打开、读取和关闭,其中主要涉及基本DOS系统功能调用指令的使用。
第二块是文件的显示,包括段地址、偏移地址、以及读取的文件内容(ASCII码及对应的符号),其中就涉及到多次转移和循环,需要多个子程序的支持才能实现(注意子程序要进行存储保护和恢复)。
程序开始之前,首先在DATASEGMENT数据段中定义BUF1用来存储读取的文件,用BUF来存储文件名的最大字符缓冲以及实际输入的字符个数,通过相连的FILE来保存实际输入的文件名,HANDLE的作用是在成功打开文件后保存文件代号,ERROR_MESSAGE和MESSAGE分别是提示语句,用来提示错误和键入值。
第一大块(文件的获取)的内容主要依靠基本的键盘键入以及文件存储实现:
1.首先要键盘输入需要显示内容的文件名,通过0A号功能键入一个文件名到缓冲区,用BUF来存放缓冲区最大字符数和实际输入的文件名的长度,其中并不存放文件名,真正的文件名用FILE来存放,输入完以后在FILE末给“0”(MOV指令)以结束并确认输入,文件名键入完成;
2.键入完成后,打开文件,通过3D号功能打开文件,需要先将AL置0以选择读功能(AL=1为写,2为读/写),将FILE文件名首地址给DX以读取文件名,如果打开失败则显示错误,AX=错误码,如果成功则AX=文件代号,文件代号需要通过第三方保存,因为在后续操作需要使用,进入下一步;
3.通过3F号功能读取文件,调用参数BX=文件代号,CX=读取字节数,用BUF1读取文件的内容,如果读取文件失败,则显示错误,AX=错误码,如果成功读取文件,则文件保存在BUF1中,AX=实际读入的字节数;
4.将HANDLE中所存的文件代号给BX,通过3E号功能完成文件关闭功能,如果程序到此都没有发生错误,则运行成功,进入下一个阶段,如失败,则提示错误,AX=错误码。
第二大块功能主要是通过循环、转移、比较等来实现最终显示:
1.由于D命令格式显示有其特殊的要求(上文已经提及),所以在设计时也应该考虑在内,本程序设置256个字符,每行显示16个字节,共16行,这里可以用到loop循环16次,每一次显示一行内容;
2.显示段地址,调用子程序显示段地址,将DATA段的地址给BX,通过4次循环(一次左移4位)依次读出4个4位二进制数,用4位16进制表示,具体规则是,将每次循环到低位的数和0FH相与,只留下最低4位,让其与30H相加,如果小于3AH,说明是0-9之间的数,由16进制的规则可知他们都可以直接显示,如果大于等于3A,则要将其加7(如A对应10,加30H后为3A,加7后为41H,为A对应的ASCII码),经过循环后,可以将段地址显示,段地址和偏移地址间要加“:
”号;
3.显示偏移地址,用DI作为偏移量,初始化为0,将BUF[DI]的地址给BX,以显示段地址的方式将偏移地址显示出,然后显示一个空格;
4.前8个对应字符ASCII码的显示,因为D命令格式要求8个字符中间要加一个“-”号,所以在程序编写时要分两次进行,中间加上“-”号。
通过8次循环来依次显示前8个字节,通过BUF1[DI]依次读取BUF1中的内容,DI初始为0;
5.后8个对应字符ASCII码的显示原理与第4步相同,在此不进行过多阐述;
6.显示ASCII码对应的字符,由于之前DI已经增到16,但我们需要重新开始读取BUF1,以此来显示改行最开始的字符,所以要先将DI减16,回到每一行的最初位置,再通过16次循环将每行16个字节显示出来,这里要注意D命令格式的要求,每个非打印字符在显示的ASCII部分由“.”表示;
7.每一行显示完毕以后,由于会执行POPDI的操作,所以DI=16的值会被清楚,在进行显示下一行时,先要人为将DI加16,使当前地址指向BUF1的第16个位置,而不是重新开始,经过16次循环后,256个字节将全部显示出来。
3.程序设计框图
(1)第一块设计框图:
关于文件获取,包括键入、打开、读取以及关闭。
N
Y
N
Y
图3.1文件获取
表3-1
文件获取中使用的DOS系统功能调用表
功能
调用参数
返回参数
0A键盘输入到缓冲区
DS:
DX=缓冲区首址
(DS:
DX)=缓冲区最大字符数
(DS:
DX+1)=实际输入的字符数
3D打开文件
DS:
DX=ASCIZ串地址
AL=访问和文件共享方式
0=读1=写2=读/写
成功:
AX=文件代号
失败:
AX=错误码
3E关闭文件
BX=文件代号
失败:
AX=错误码
3F读文件或设备
DS:
DX=数据缓冲区地址
BX=文件代号
CX=读取的字节数
成功:
AX=实际写入的字节数
AX=0已到文件
失败:
AX=错误码
该表中详细列举了文件获取中需要使用的一些DOS系统调用功能,调用参数可以看作功能使用所需要的前提条件,返回参数是运行后的一个返回值,在程序设计中要注意每一个功能使用之前必须将调用参数配置好,否则会出现错误。
表3-2
文件获取中的主要子函数及功能表
子函数
功能
IN_FINAME
用于文件名的键入
OPENF
用于文件内容的获取
文件名的键入要注意哪个寄存器存字符数,哪个寄存器存储真正的文件名,以及键入完成后需要进行的操作,文件的获取要注意表3-1中的条件。
(2)第二块设计框图:
关于段地址、偏移地址、16个ASCII码、16个字节的显示
(Ⅰ)总体设计:
N
Y
图3.2总体设计
(Ⅱ)段地址显示:
N
Y
Y
N
图3.3段地址显示
(Ⅲ)偏移地址显示:
N
Y
Y
N
图3.4偏移地址显示
(Ⅳ)ASCII码显示(一次显示八个字节,调用两次):
N
Y
Y
N
N
Y
图3.5ASCII码显示
(Ⅴ)字符显示:
YN
N
Y
图3.6字符显示
表3-3
文件显示中的主要子函数及功能表
子函数
功能
DISPLAY
D命令显示子程序,是对显示的各部分的总体控制,其内部分为段地址显示、偏移地址显示、ASCII码显示、字符显示
DISP2
显示段地址和偏移地址,0-9以30H-39H显示,如果是A-Z,则将其内容加7,以41H-5AH显示
ASCII
显示每一行16个字节的ASCII码
ELEMENT
显示每一行ASCII码对应的实际字符,有效字符按照对应ASCII码显示,无效字符用“.”表示
显示文件内容时要注意D命令格式的排版,必须要按照严格的要求和顺序进行,同时对相应地址内容的读取也要做到心中有数,否则很容易造成地址不清楚而导致读取内容错误。
4.源程序清单
DATASEGMENT
BUF1DB256DUP(?
);存放文件内容
BUFDB10,?
;第一个为缓冲区最大字符数第二个为实际输入的字符数
FILEDB10DUP(?
);FILE来存储实际的内容
HANDLEDW?
ERROR_MESSAGEDB0AH,'ERROR!
','$'
MESSAGEDB'Pleaseinputthefilename:
',0DH,0AH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADX,MESSAGE
MOVAH,9
INT21H
CALLIN_FINAME
CALLOPENF
MOVCX,16
MOVDI,0
FLAG:
CALLDISPLAY
ADDDI,16
loopFLAG
MOVAH,1
INT21H
MOVAX,4C00H
INT21H
IN_FINAMEPROCNEAR;键盘输入子程序设计
LEADX,BUF
MOVAH,0AH
INT21H
MOVBL,BUF+1
MOVBH,0
MOVFILE[BX],0
RET
IN_FINAMEENDP
OPENFPROCNEAR;打开文件子程序设计
PUSHAX
PUSHBX
pushCX
MOVDX,OFFSETFILE;将文件名首地址给DX
MOVAL,0;AL置0读模式
MOVAH,3DH;打开文件
INT21H
JCERROR;CF=1失败
MOVHANDLE,AX;成功则文件代号
MOVBX,AX;读文件的文件代号
MOVCX,256;读取字节数
MOVDX,OFFSETBUF1;BUF1首地址给DX,文件内容
MOVAH,3FH;读文件
INT21H
JCERROR;CF=1失败
MOVBX,AX
MOVBUF1[BX],0;成功则送结尾标志
MOVBX,HANDLE;将文件代号给BX
MOVAH,3EH;关闭文件
INT21H
JNCEND1;CF=0
ERROR:
MOVDX,OFFSETERROR_MESSAGE
MOVAH,9
INT21H
END1:
POPCX
POPBX
POPAX
RET
OPENFENDP
DISPLAYPROCNEAR;D命令显示子程序设计
PUSHDI
MOVBX,DATA
CALLDISP2;显示段地址
MOVAH,2
MOVDL,':
'
INT21H
LEABX,BUF1[DI];显示偏移地址
callDISP2
MOVAH,2
MOVDL,20H
INT21H
CALLASCII;前面8个H
MOVDL,'-'
MOVAH,2
INT21H
CALLASCII;后面8个H
MOVAH,2
MOVDL,20H
INT21H
SUBDI,16
CALLELEMENT
MOVAH,2
MOVDL,0AH
INT21H
POPDI
RET
DISPLAYENDP
DISP2PROCNEAR
PUSHAX
PUSHCX
PUSHDX
MOVCH,4;循环次数
REP2:
MOVCL,4;位移位数
ROLBX,CL
MOVDL,BL
ANDDL,0FH
ADDDL,30H
CMPDL,3AH
JLPRIN2
ADDDL,7
PRIN2:
MOVAH,2
INT21H
DECCH
JNZREP2
POPDX
POPCX
POPAX
RET;循环四次,把BX中的内容从高位到低位显示
DISP2ENDP
ASCIIPROCNEAR
PUSHAX
PUSHCX
PUSHDX
MOVSI,0
ASCII1:
MOVBL,BUF1[DI];把目前所指存入BL
CALLDISP1
INCDI
INCSI
CMPSI,8
JEEXIT1
MOVAH,2
MOVDL,20H
INT21H
JMPASCII1
EXIT1:
POPDX
POPCX
POPAX
RET
ASCIIENDP
DISP1PROCNEAR
PUSHAX
PUSHCX
PUSHDX
MOVCH,2
REP1:
MOVCL,4
ROLBL,CL
MOVDL,BL
ANDDL,0FH
ADDDL,30H
CMPDL,3AH
JLPRIN1
ADDDL,7
PRIN1:
MOVAH,2
INT21H
DECCH
JNZREP1
POPDX
POPCX
popAX
RET
DISP1ENDP
ELEMENTPROCNEAR
PUSHAX
PUSHCX
PUSHDX
MOVSI,0
X:
MOVAH,2
MOVDL,BUF1[DI]
CMPDL,20H;小于32的都是控制字符控制字符都用'.'显示
JLENEXTT
JMPNEXTT1
NEXTT:
MOVDL,'.'
NEXTT1:
INT21H
INCDI
INCSI
CMPSI,16
JEEXIT2
JMPX
EXIT2:
POPDX
POPCX
POPAX
RET
ELEMENTENDP
CODEENDS
ENDSTART
5.程序调试结果及分析
(1)编程软件MasmforWindows集成实验环境2012:
图5.1软件界面
(2)输入要显示文件的文件名(个人限定不能超过10个字节):
图5.2输入文件名
最多允许输入十个字节,超过则不可继续输入:
图5.3文件名超过限定数
若输入一个不存在的文件名,则软件会报错:
图5.4文件名不存在
(3)正确输入文件名,得到正确结果并显示,结果以D命令的格式显示,显示内容包括段地址、偏移地址、文件内容的ASCII码、文件内容,其中一行只显示16个字节,前8个字节与后8个字节之前用“-”号隔开,结果如下图所示,各部分内容均成功显示:
图5.5程序运行结果
计算机与通信学院课程设计评分表
课程名称:
汇编语言程序设计
项目
评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编程序 读入一个文本文件并以DEBUG中的D命令格式显示 读入 一个 文本文件 DEBUG 中的 命令 格式 显示