-176- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
打开文件只能对磁盘上已经存在的文件进行操作,如果我们想在磁盘上建立一个新的文件,那么我们应该使用21H中断的16H功能。这个功能所要传递的参数和0FH功能一致,返回的结果也和OFH功能相同,大家可以将程序FCB1.ASM中的指令"MOV AH,0FH"改为"MOV AH,16H",即可构成一个用于观察16H功能的程序。 为了避免不必要的损失,我们在执行或跟踪这个程序之前需要讨论一下建立文件时要注意的一些东西。这个功能调用是在当前目录下新建一个目录项并使相应的FCB处于打开状态,所以使用这个功能后无需再用0FH功能。很重要的一点,如果我们建立的文件恰好和磁盘上已存在的某个文件重名,那么执行此操作后磁盘上己有的文件其长度将被置成0,如果对这个文件执行写操作,那么旧的内容将被新内容覆盖。所以在执行或跟踪这个程序之前请确认当前目录下没有CONFIG.SYS,否则下次启动系统时恐怕就要出麻烦。下面我们就来跟踪这个程序: |
|||||||||||||||||||||
C:\ASM\>DEBUG FCB1.EXE[Enter] | |||||||||||||||||||||
G=0 C[Enter] | |||||||||||||||||||||
AX=1600 | BX=0000 | CX=004F | DX=0000 | SP=0000 | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=2589 | ES=2579 | SS=2589 | CS=258C | IP=000C | NV UP EI PL NZ NA PO NC | ||||||||||||||||
258C:000C | 0AC0 | OR AL,AL | |||||||||||||||||||
-d0 24 | 当前驱动器为"C:" | 文件名及扩展名 | |||||||||||||||||||
2589:0000 | 03 43 4F 4E 46 49 47 20-20 53 59 53 00 00 80 00 | .CONFIG SYS.... | |||||||||||||||||||
2589:0010 | 00 00 00 00 46 21 CD 8B-40 02 42 00 00 61 B8 0F | ....F!..@.B..a.. | |||||||||||||||||||
2589:0020 | 00 00 00 00 00 | ..... | |||||||||||||||||||
跟踪结果和0FH功能几乎一样,不过DOS返回到FCB中的数据有很多与0FH功能不同,比如建立文件的时间和日期,大家可以自己分析一下日期和时间,对对手表,看看是否一致。 继续将这个程序执行完,然后退出DEBUG,再次执行DIR操作,看看当前目录下是否出现了一个长度为0的新文件。 在扩展FCB的支持下,这个功能还可以建立具有特定属性的文件,继续修改FCB1.ASM,将数据段定义改为下面的形式(代码段不变): |
|||||||||||||||||||||
DATA MY_FCB ATTRIB DRIVE FILE_NAME EXT_NAME CUR_BLOCK REC_SIZE FILE_SIZE CREA_DATE |
SEGMENT ASSUME LABEL DB DB DB DB DB DB DW DW DW DW |
DS:DATA BYTE -1 5 DUP (0) 1 0 'CONFIG ' 'SYS' ? ? 2 DUP(?) ? |
;扩展的FCB起始 ;驱动器号,0:当前 1:A 2:B ... ;文件名 ;扩展名 ;当前记录块号 ;记录长度 ;文件长度,由系统填入 ;建立或最后修改的日期,由系统填入 |
||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |