目录 上一页 下一页 下一章

第7章 文件控制块 -203-

  笔者使用了"TASM.EXE"这个程序作为"调试"对象,其实可以选择任意一个".EXE"的文件。现在请大家回想一下当一个".EXE"文件被DEBUG调入后,段寄存器DS和ES指向谁所在的段?
  段寄存器DS和ES指向"PSP"所在的段。我们现在就来看一看PSP中还有什么有用的数据:
-d0[Enter]
1027:0000CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 92 09 8A 03. ........O.....
1027:001092 09 17 03 92 09 81 09-01 04 01 00 02 FF FF FF................
1027:0020FF FF FF FF FF FF FF FF-FF FF FF FF 18 10 4C 01..............L.
1027:003097 0D 14 00 18 00 27 10-FF FF FF FF 00 00 00 00......'.........
1027:004007 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................
1027:0050CD 21 CB 00 00 00 00 00-00 00 00 00 00 41 41 41.!...........AAA
1027:006020 20 20 20 20 20 20 20-00 00 00 00 00 42 42 42        .....BBB
1027:007020 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00        ........
  "金矿"并不难发现,注意PSP中偏移5CH和偏移6CH处的数据,我们给"TASM.EXE"的两个参数"aaa"和"bbb"就在其中。我们由此得出了第一个结论:程序所需的两个参数出现在PSP偏移5CH和6CH处,而且是以大写形式出现的。
  通过这个实验我们也能发觉三个问题:第一,PSP偏移5CH和6CH处存放的数据都是"0",并不是真正的命令行参数,为什么要说参数出现在偏移5CH和6CH处呢?如果这个"0"是参数的一部分的话,那么它又有什么含义?第二,如果有更多的参数会有什么情况?第三,如果有开关符"/"又会有什么情况?为搞清这三个问题,我们再做三次实验。先看看那个奇怪的"0"是怎么回事,注意命令中加有下划线的内容:
C:\ASM\>debug tasm.exe a:xxx c:yyy[Enter]
-d0[Enter]
1028:0000CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 92 09 8A 03. ........O.....
1028:001092 09 17 03 92 09 81 09-01 04 01 00 02 FF FF FF................
1028:0020FF FF FF FF FF FF FF FF-FF FF FF FF 18 10 4C 01..............L.
1028:003097 0D 14 00 18 00 27 10-FF FF FF FF 00 00 00 00......'.........
1028:004007 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................
1028:0050CD 21 CB 00 00 00 00 00-00 00 00 00 01 58 58 58.!...........xxx
1028:006020 20 20 20 20 20 20 20-00 00 00 00 03 59 59 59        .....yyy
1028:007020 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00        ........
  问题清楚了,偏移5CH和6CH处存放的数据原来是驱动器号,我们做第一次实验时没有指定驱动器,所以DOS给我们填入了"默认"驱动器号。这个问题就有些奇怪了,难道DOS会把我们给出的参数都当做文件名来处理吗?说到此,笔者认为已经到了真正搞清这两个数据结构的时候了。
  在PSP偏移5CH和6CH处有两个DOS提供给我们的十分重要的数据结构,这两个数据结构我们称之为"格式化未打开的FCB"。实际上每一个FCB的长度只有16个字节,其结构与一般的FCB相同。注意这两个FCB都是"未打开的",如果我们将第一个FCB打开了,那么第二个FCB就会被覆盖。

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章