![]() | 第8章 文件句柄功能与磁盘 | -223- | |||||||||||||||||||
们完全可以使用"DD"(Define Double word)伪指令直接定义32位的数据。不过考虑到某些早期版本的编译程序可能不支持这个伪指令,所以还是采用了DW伪指令,这并不是问题的关键。下面给出了这个程序跟踪执行的结果: | |||||||||||||||||||||
-g=0 2e[Enter] | |||||||||||||||||||||
Press any key to display the next star-map. | |||||||||||||||||||||
AX=4200 | BX=0005 | CX=0002 | DX=1520 | SP=FFFE | BP=0000 | SI=002A | DI=0000 | ||||||||||||||
DS=124D | ES=123D | SS=124D | CS=1254 | IP=002E | NV UP EI PL NZ NA PO NC | ||||||||||||||||
1254:002E | CD21 | INT 21 | |||||||||||||||||||
以上是执行42H功能调用之前各个寄存器的情况,"CX:DX"中是文件读写指针的新位置,AL寄存器指定方式0,BX寄存器为文件句柄。下面执行指令INT 21: | |||||||||||||||||||||
-p[Enter] | |||||||||||||||||||||
AX=1520 | BX=0005 | CX=0002 | DX=0002 | SP=FFFE | BP=0000 | SI=002A | DI=0000 | ||||||||||||||
DS=124D | ES=123D | SS=124D | CS=1254 | IP=0030 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
1254:0030 | 7216 | JB 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 |