经典汇编语言教程:例10.19 编写一个类型于DOS内部命令TYPE的程序

例10.19 编写一个类型于DOS内部命令TYPE的程序

……>type 文件1,文件2,…

其功能是分别显示其参数文件1、文件2等内容,在显示文件内容前先显示文件名。显示完内容后,暂停,等待用户按任意键。若某文件不存在,则显示相应的提示信息。

解:为了较好地解答本题,我们可以对该问题按以下步骤来解决:
1、若命令行参数中的字符数为0,则结束本程序的运行;
2、从命令行参数中分离出一个文件名;
3、调用子程序,显示当前文件名、文件内容和等待用户按键;
4、重复步骤1~3,直到所有参数被处理完。

.MODEL SMALL, C
.DATA

File

DB 14 DUP(' ')

Buff 

DB 128 DUP(0)

Msg1

DB 0DH, 0AH, "$"

Msg2

DB "Not Found$"

Msg3

DB "Press any key...$"
.CODE
;显示字符串MSG后,再进行回车、换行
DispStrPROC USES AX DX, MSG:PTR BYTE
MOVDX, MSG;显示指定的信息 
MOVAH, 09H
INT21H
LEADX, Msg1;显示回车、换行
MOVAH, 09H
INT21H
RET
DispStrENDP
;文件名的长度为传递参数Len。若文件不存在,则显示提示信息,否则,显示文件内容;
;完成上述操作后,等待用户按键
DispPROC USES AX BX CX DX, Len:BYTE
XORBX, BX
MOVBL, Len
MOVFile[BX], '$'
INVOKEDispStr, ADDR File;显示文件名
MOVFile[BX],0
LEADX, File
MOVAL, 0H
MOVAH, 3DH
INT21H
.IF CARRY?;若创建失败,则显示失败信息
INVOKE DispStr, ADDR Msg2

JMP

over1
.ENDIF
MOVBX, AX;参见例8.14中的有关说明
read:
LEADX, Buff
MOVCX, 128
MOVAH, 3FH
INT21H
.IF CARRY? || AX==0

JZ

close
.ENDIF
PUSHBX
LEADX, Buff
MOVCX, AX
MOVBX, 1
MOVAH, 40H
INT21H
POPBX
JMPread
close:
MOVAH, 3EH;关闭已打开的文件
INT21H
over1:
INVOKEDispStr, ADDR Msg3;显示等待用户按键提示信息
MOVAH, 07H
INT21H;等待用户按键
RET
DispENDP
.STARTUP
MOVAH, 51H
INT21H
MOVES, BX
MOVBX, 80H
MOVCL, ES:[BX]
DECCL
INCBX
.WHILECL>0;CL=未被处理的参数字符数

XOR

AL, AL;记录文件名的长度

LEA

DI, File
.REPEAT

INC

BX

MOV

AH, ES:[BX]

DEC

CL
.BREAK .IF AH==','

MOV

[DI], AH;从参数中分离出字符,存入文件名中

INC

DI

INC

AL

.UNTIL

CL==0

INVOKE

Disp, AL;处理当前分离出来的文件名
.ENDW
.EXIT 0
END

经典汇编语言教程·相关目录

第1章 汇编语言的由来,数据类型第2章 CPU资源和存储器
第3章 操作数的寻址方式第4章 标识符和表达式
第5章 微机CPU的指令系统第6章 程序的基本结构
第7章 子程序和库第8章 输入输出和中断
第9章 宏第10章 应用程序设计
第11章 数值运算协处理器第12章 汇编语言和C语言
汇编语言重要附录Windows API函数大全
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号