目录 上一页 下一页 下一章

第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

目录 上一页 下一页 下一章