![]() | 第8章 文件句柄功能与磁盘 | -209- | |||||||||||||||||||
123D:013C 123D:013E 123D:0140 123D:0142 123D:0140 123D:0142 |
MOV INT MOV INT MOV INT |
AH,09 21 AH,3E 21 AH,4C 21 |
;用3EH功能 ;关闭文件 ;结束进程 |
||||||||||||||||||
通过这个实验程序大家应该掌握两点:其一,ASCIIZ串的定义方法;其二,3DH功能的应用。第一个问题可以对照我们前面讨论过的内容,而第二个问题可以参考后面对3DH功能的说明。我们现在来实际跟踪一下这个程序,看看还能发现什么新鲜的东西。 | |||||||||||||||||||||
-g=100 12c[Enter] | |||||||||||||||||||||
AX=0005 | BX=0000 | CX=0042 | DX=0102 | SP=FFFE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=123D | ES=123D | SS=123D | CS=123D | IP=012C | NV UP EI PL NZ NA PO NC | ||||||||||||||||
123D:012C | 7209 | JB 0139 | |||||||||||||||||||
用"G"命令在012CH处打一个断点,则DEBUG会在执行INT 21指令后为我们列出各寄存器的情况。可以看到AX寄存器返回一个16位的数字05H,这就是我们所需要的那个所谓的"句柄"。这一个数字所代表的就是我们刚刚打开的那个文件,从此以后我们对这个文件进行其它操作时必须要给DOS提供这个数字。 前面几节使用FCB功能打开文件后,DOS会在文件控制块中填入好多的信息供程序使用。而使用句柄功能却只能得到一个简单的数字。这不能不说是句柄功能与FCB功能的最大差别了。当然,事实上DOS仍然要取得有关文件的特征信息的,只不过这些信息都存于DOS内部,由DOS私用而已。 标志寄存器中的CF位为0,表明DOS成功的打开了要处理的文件,如果CF标志为1则说明功能调用执行出错。因此应用指令依据CF标志的状态转移即可区分文件操作是否正确。指令"JNC"恰好能达到此目的: |
|||||||||||||||||||||
![]() |
助记符:JNC(Jump if Not Carry) 用 途:依据CF标志状态转移 格 式:JNC 目的地址 执 行:若CF标志等于0,此指令将使CPU转移至目的地址处继续执行程序, 否则CPU执行JNC指令下面的程序 |
||||||||||||||||||||
这是一个条件转移指令,注意它只能进行短程转移。与此指令相对的指令是JC,第六章里已经介绍过。句柄功能返回错误状态的方法与FCB功能不同,应加以注意。 先别忙着"GO"这个程序,我想问诸位一句大家是否对AX寄存器中的"句柄"有什么疑问?问题并不难发现,为什么这个句柄不是"00H"呢?我们只打开了一个文件呀?这里面有个不大不小的秘密,我打算在下一节中将其"曝光"。 程序中使用的3EH功能用于关闭文件,所谓关闭,其含义和我们在前面所讲的一样,也是将BUFFER中的数据存入磁盘同时更新目录项,这里我们就不多讨论了,要注意的是使用这个功能前别忘记在BX寄存器中放入要关闭的文件对应的"句柄"。 附带说明一下,关于打开文件时在AL寄存器中填入的"存取方式"一项,这是一个取值为 |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |