例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后,再进行回车、换行 | ||||
DispStr | PROC USES AX DX, MSG:PTR BYTE | |||
MOV | DX, MSG | ;显示指定的信息 | ||
MOV | AH, 09H | |||
INT | 21H | |||
LEA | DX, Msg1 | ;显示回车、换行 | ||
MOV | AH, 09H | |||
INT | 21H | |||
RET | ||||
DispStr | ENDP | |||
;文件名的长度为传递参数Len。若文件不存在,则显示提示信息,否则,显示文件内容; ;完成上述操作后,等待用户按键 |
||||
Disp | PROC USES AX BX CX DX, Len:BYTE | |||
XOR | BX, BX | |||
MOV | BL, Len | |||
MOV | File[BX], '$' | |||
INVOKE | DispStr, ADDR File | ;显示文件名 | ||
MOV | File[BX],0 | |||
LEA | DX, File | |||
MOV | AL, 0H | |||
MOV | AH, 3DH | |||
INT | 21H | |||
.IF CARRY? | ;若创建失败,则显示失败信息 | |||
INVOKE DispStr, ADDR Msg2 |
||||
JMP |
over1 | |||
.ENDIF | ||||
MOV | BX, AX | ;参见例8.14中的有关说明 | ||
read: | ||||
LEA | DX, Buff | |||
MOV | CX, 128 | |||
MOV | AH, 3FH | |||
INT | 21H | |||
.IF CARRY? || AX==0 | ||||
JZ |
close | |||
.ENDIF | ||||
PUSH | BX | |||
LEA | DX, Buff | |||
MOV | CX, AX | |||
MOV | BX, 1 | |||
MOV | AH, 40H | |||
INT | 21H | |||
POP | BX | |||
JMP | read | |||
close: | ||||
MOV | AH, 3EH | ;关闭已打开的文件 | ||
INT | 21H | |||
over1: | ||||
INVOKE | DispStr, ADDR Msg3 | ;显示等待用户按键提示信息 | ||
MOV | AH, 07H | |||
INT | 21H | ;等待用户按键 | ||
RET | ||||
Disp | ENDP | |||
.STARTUP | ||||
MOV | AH, 51H | |||
INT | 21H | |||
MOV | ES, BX | |||
MOV | BX, 80H | |||
MOV | CL, ES:[BX] | |||
DEC | CL | |||
INC | BX | |||
.WHILE CL>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 |