目录 上一页 下一页 下一章

第8章 文件句柄功能与磁盘 -223-

们完全可以使用"DD"(Define Double word)伪指令直接定义32位的数据。不过考虑到某些早期版本的编译程序可能不支持这个伪指令,所以还是采用了DW伪指令,这并不是问题的关键。下面给出了这个程序跟踪执行的结果:
-g=0 2e[Enter]
Press any key to display the next star-map.
AX=4200BX=0005CX=0002DX=1520SP=FFFEBP=0000SI=002ADI=0000
DS=124DES=123DSS=124DCS=1254IP=002E NV UP EI PL NZ NA PO NC
1254:002ECD21INT 21
  以上是执行42H功能调用之前各个寄存器的情况,"CX:DX"中是文件读写指针的新位置,AL寄存器指定方式0,BX寄存器为文件句柄。下面执行指令INT 21:
-p[Enter]
AX=1520BX=0005CX=0002DX=0002SP=FFFEBP=0000SI=002ADI=0000
DS=124DES=123DSS=124DCS=1254IP=0030 NV UP EI PL NZ NA PO NC
1254:00307216JB 0048
  可以看到"DX:AX"寄存器返回了文件指针的新指向。
  STARMAP程序现在有了两个版本,我们搞的第一个版本只能从头至尾按顺序显示国标汉字,而这个新版本可以显示任意的汉字,关键在于正确地定位文件读写指针。这个程序中还有一些问题将在下一章进行更深入讨论,现在如果有什么不明白的地方可以先放一放,大家只要知道从文件HZK16中的某个位置读取32个字节加以处理就可以看到一个国标汉字或符号即可。
  至于文件指针的相对移动问题笔者不准备给出程序例,大家可以自己研究。但是需要特别讨论的是文件指针的"绝对倒移"问题。这样的移动方式初看起来好象没什么用途,它不符合人们的习惯。但是这个方式在实践中还是有应用的,请思考这样一个问题:如果程序设定偏移量为0,而使用方式2移动文件读写指针,那么DOS在执行完功能调用后通过"DX:AX"寄存器给我们返回的数据有什么特殊的意义?
  毫无疑问那是文件读写指针指向的新位置,即文件的结尾。但是如果换个方向思考这个问题就会发现那个32位的数据其实就是文件的长度。下面这个程序可以查出 "CONFIG.SYS"文件的长度:
data

fname
msg
tbuff

data

code
segment
assume
db
db
db
db
ends

segment

ds:data
'c:\config.sys',0
'Your config.sys includ
5 dup (20h)
' Bytes',0dh,0ah,24h






e '
;定义一个用于保存数字的缓冲区





Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章