-220- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
向了第三个字节,所以当程序第二次调用3FH功能读入数据时,我们实际读取的是文件的第三个字节,这个字节随后又被写入文件的第四个字节处。可以看出,由于读、写功能交替修改文件读写指针,使得程序每次读入奇数位置的字符并将其写入偶数位置,因而使"[MENU]"变成了"[[EEUU"。 以上就是"文件读写指针"在文件处理过程中所起的作用,由于它是起一个"定位"的作用,所以人为修改这个数据使其指向文件中的任意一个位置,我们就能存取从相应位置开始的数据。现在的问题就是如何才能修改这个数据? DOS为我们提供了一个功能调用专用于修改文件读写指针,表7-1中包括了这个功能,下面给出这个功能更详细的说明: |
|||||||||||||||||||||
![]() |
功能号:42H 用 途:移动文件读写指针 参 数:BX--文件句柄 CX--偏移值的高16位;DX--偏移值的低16位 AL--方式代码 00H--偏移量从文件头开始(绝对移动) 01H--偏移量从当前位置开始(相对机动) 02H--偏移量从文件尾开始(绝对倒移) 调 用:INT 21H 返 回:如果成功,CF标志置0,DX:AX--文件读写指针所指向的新位置; 如果失败,CF标志置1,AX--错误代码 |
||||||||||||||||||||
有一点很关键的地方就是CX:DX寄存器中所设置的32位数据究竟是何含义?我们说随AL寄存器中的方式代码不同,CX:DX寄存器中的数据含义也有区别。当AL寄存器中的方式代码为00H时,CX:DX代表了从文件"头部"开始的偏移位置。比如CX寄存器为0,DX寄存器为0020H,这时用42H功能就可以使文件读写指针指向文件中的第32个字节处;当AL寄存器中的方式代码为01H时,CX:DX代表了从"当前"位置开始的偏移量。还以CX=0,DX=0020H为例,若当前文件读写指针正指向文件偏移0020H处,此时用方式1移动文件指针时DOS会将文件读写指针"增加"20H,使其指向距离文件首部64字节处。可见在文件读写指针为0的情况下方式0与1有相同的效果。至于方式3,CX:DX代表的是距文件尾部的偏移量。为了搞清楚这个问题,我们来看下面两个程序: | |||||||||||||||||||||
STARMAP.ASM | |||||||||||||||||||||
data fname buffer off msg data code |
segment assume db db dw db ends segment assume |
ds:data 'hzk16',0 32 dup(0) 1520h,0002h,3340h,0001h,18e0h,0000h,74a0h,0002h,2520h,0001h 'Press any key to display the next star-map.',0dh,0ah,24h cs:code |
|||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |