![]() | 第7章 文件控制块 | -181- | |||||||||||||||||||
ERR_EXIT: MAIN BUFFER CODE |
MOV INT OR JNZ MOV INT MOV MOV INT MOV INT ENDP LABEL ENDS END |
DX,OFFSET MY_FCB 21H AL,AL ERR_EXIT AH,4CH 21H AH,9 DX,OFFSET ERRMSG 21H AH,4CH 21H BYTE MAIN |
;正确读入数据了吗? ;没有正确读入数据,转ERR_EXIT ;结束进程 ;输出错误信息 ;结束进程 ;在代码段中设置新的DTA |
||||||||||||||||||
在此例中我们使用了一个新的系统功能--1AH,这个功能用于设置应用程序自己的DTA,用法很简单: | |||||||||||||||||||||
![]() |
功能号:1AH 用 途:设置应用程序的DTA 参 数:DS:DX = 应用程序的DTA起始"段:偏移"地址 调 用:INT 21H 返 回:无 |
||||||||||||||||||||
使用这个功能之后,DOS就不再使用缺省的DTA了。之后所有的磁盘服务都使用新的DTA,直至应用程序设置了另一个DTA为止。我在设计这个程序时用了一点小技巧,当应用程序打开一个文件后,DOS会把有关这个文件的一些特征信息存入FCB中。其中FCB偏移10H的四个字节(我们习惯称为一个"双字")填入了文件的长度,我的CONFIG文件长度只有667字节,所以我将这个双字的低16位取出作为一个记录的长度存入FCB偏移0EH处,这样一来一个记录的长度恰好等于文件的长度,所以应用程序只需顺序读一次就能读入整个文件的内容。 当然,使用这样的技巧是有限制的,那就是被处理的文件长度要小于64KB,这是因为DOS只用一个字表示记录的大小。如果需要处理更大的文件,则可根据需要设置合适的记录长度和DTA。 这个程序中没有使用DB伪指令定义DTA缓冲区,而是将DTA设置在代码段中,并起始于代码段的后面,这样做的目的是为了缩短编译后可执行文件的长度。大家也可以在数据段中用于DB伪指令定义一个数千字节的DTA空间,看看编译后成EXE文件的长度和这个程序有无差别,差别有多大。 |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |