2013-10-07 29 views
1

說我有PROGRAM.ASM - 在數據段我有以下:8086裝配/ MS-DOS,在命令行傳遞文件名

.data 

Filename db 'file.txt', 0 
Fhndl dw ? 
Buffer db ? 

我想「file.txt的」是動態我猜?一旦編譯,PROGRAM.EXE需要能夠通過命令行來接受一個文件名:

c:\> PROGRAM anotherfile.txt 
EXECUTION GOES HERE 

如何啓用這個?先謝謝你。

回答

3

DOS將命令行存儲在名爲Program Segment Prefix(「PSP」)的傳統結構中。我的意思是傳統。該結構旨在與從CP/M移植的程序向後兼容。

PSP在哪裏?

您知道如何構建.COM文件,程序始終以ORG 100h開頭?原因恰恰在於 - 對於.COM程序 - PSP始終存儲在代碼段的開頭(CS:0h)。 PSP的長度爲0FFh字節,實際的程序代碼從那之後開始(即CS:100h)。

由於.COM格式的關鍵特徵是所有段寄存器都以相同的值開始(並且COM程序通常不會改變它們),所以在DS:00h和ES:00h處地址也很方便。

要從.COM程序讀取命令行,可以在CS:80h(或DS:80h等)處選擇其長度,只要您沒有更改這些寄存器即可。命令行在CS:81h開始,以PSP的其餘部分結束,以回車(0Dh)作爲終止符,因此命令行永遠不會超過126個字節。因爲WinNT使用了不同的機制來訪問命令行,所以WinNT/WinNT可以使用不同的機制來訪問命令行, XP /等命令行不受此大小限制)。

對於.EXE程序,您不能依賴CS:00h,因爲啓動代碼段可能只是在內存中的任何位置。但是,程序啓動時,DOS始終將PSP存儲在默認數據段的基礎上。因此,在啓動時,DS:00h和ES:00h將始終指向PSP,用於.EXE和.COM程序。

如果您在程序開始時沒有跟蹤PSP地址,並且您更改了DS和ES,則可以隨時通過INT 21h函數62h隨時要求DOS提供段值。 PSP地址的段部分將以BX返回(偏移量當然是0h)。