说我有PROGRAM.ASM - 我在数据段中有以下内容:
.data
Filename db 'file.txt', 0
Fhndl dw ?
Buffer db ?
我想'file.txt'是动态的我猜?编译完成后,PROGRAM.exe需要能够通过命令行接受文件名:
c:\> PROGRAM anotherfile.txt
EXECUTION GOES HERE
如何启用此功能?提前谢谢。
答案 0 :(得分:3)
DOS将命令行存储在名为Program Segment Prefix(“PSP”)的旧结构中。我的意思是遗产。此结构旨在向后兼容从CP / M移植的程序。
PSP在哪里?
您知道作为.COM
文件构建的程序始终以ORG 100h
开头吗?其原因恰恰是 - 对于.COM程序 - PSP始终存储在代码段的开头(CS:0h)。 PSP的长度为0FFh,实际的程序代码就在此之后(即CS:100h)开始。
地址在DS:00h和ES:00h也很方便,因为.COM格式的关键特性是所有段寄存器都以相同的值开始(并且COM程序通常不会更改它们)。
要从.COM
程序读取命令行,您可以在CS:80h(或DS:80h等)选择其长度,只要您没有更改这些寄存器即可。命令行从CS:81h开始,以PSP的其余部分结束,以回车(0Dh)作为终结符结束,因此命令行的长度不会超过126个字节。
(这就是为什么命令行在DOS中永远是126字节的原因,尽管我们多年来都希望它可以更长。尽管WinNT使用提供了一种不同的机制来访问命令行,WinNT / XP / etc。命令行不受此大小限制的影响。)
对于.EXE
程序,您不能依赖CS:00h,因为启动代码段可以在内存中的任何位置。但是,当程序启动时,DOS始终将PSP存储在默认数据段的基础上。因此,在启动时,对于.EXE和.COM程序,DS:00h和ES:00h将始终指向PSP。
如果您没有在程序开头跟踪PSP地址,并且您同时更改了DS和ES,则可以随时通过INT 21h,功能62h请求DOS提供段值。 PSP地址的段部分将以BX返回(偏移量当然为0h)。