![]() | 第7章 文件控制块 | -203- | |||||||||||||||||||
笔者使用了"TASM.EXE"这个程序作为"调试"对象,其实可以选择任意一个".EXE"的文件。现在请大家回想一下当一个".EXE"文件被DEBUG调入后,段寄存器DS和ES指向谁所在的段? 段寄存器DS和ES指向"PSP"所在的段。我们现在就来看一看PSP中还有什么有用的数据: |
|||||||||||||||||||||
-d0[Enter] | |||||||||||||||||||||
1027:0000 | CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 92 09 8A 03 | . ........O..... | |||||||||||||||||||
1027:0010 | 92 09 17 03 92 09 81 09-01 04 01 00 02 FF FF FF | ................ | |||||||||||||||||||
1027:0020 | FF FF FF FF FF FF FF FF-FF FF FF FF 18 10 4C 01 | ..............L. | |||||||||||||||||||
1027:0030 | 97 0D 14 00 18 00 27 10-FF FF FF FF 00 00 00 00 | ......'......... | |||||||||||||||||||
1027:0040 | 07 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 | ................ | |||||||||||||||||||
1027:0050 | CD 21 CB 00 00 00 00 00-00 00 00 00 00 41 41 41 | .!...........AAA | |||||||||||||||||||
1027:0060 | 20 20 20 20 20 20 20 20-00 00 00 00 00 42 42 42 | .....BBB | |||||||||||||||||||
1027:0070 | 20 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:0000 | CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 92 09 8A 03 | . ........O..... | |||||||||||||||||||
1028:0010 | 92 09 17 03 92 09 81 09-01 04 01 00 02 FF FF FF | ................ | |||||||||||||||||||
1028:0020 | FF FF FF FF FF FF FF FF-FF FF FF FF 18 10 4C 01 | ..............L. | |||||||||||||||||||
1028:0030 | 97 0D 14 00 18 00 27 10-FF FF FF FF 00 00 00 00 | ......'......... | |||||||||||||||||||
1028:0040 | 07 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 | ................ | |||||||||||||||||||
1028:0050 | CD 21 CB 00 00 00 00 00-00 00 00 00 01 58 58 58 | .!...........xxx | |||||||||||||||||||
1028:0060 | 20 20 20 20 20 20 20 20-00 00 00 00 03 59 59 59 | .....yyy | |||||||||||||||||||
1028:0070 | 20 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 |