2017-08-15 150 views
1

我在x86 MASM彙編程序中編寫程序,並且需要訪問啓動程序時提供的命令行參數。我在多個網站上閱讀,我可以在Program Segment Prefix或PSP上訪問這些參數。訪問MASM彙編器(x86)中的命令行參數

作爲一個測試,我嘗試打印提供的參數的第一個字符。我的問題是(取決於我如何訪問PSP),我得到了錯誤的字符(或者根本沒有字符)。

... 

mov ah, 21h 
int 50h 

mov ds, dx 

mov ah, 0Ah 
mov al, offset ds:[81h] 
mov bh, 0 
mov cx, 1 
int 10h 

... 

這是訪問命令行參數的正確方法嗎?我錯過了什麼?我嘗試以幾種不同的方式訪問參數,所以我確信我的問題是由於缺乏對如何在具有偏移量的特定內存地址訪問信息的理解而導致的。

有人可以向我解釋如何訪問PSP上的命令行參數,或者我如何在一般的特定內存位置訪問某些內容?

回答

8
; mov ah, 21h ; Why? 
; int 50h  ; There is no such service defined in DOS. 
; mov ds, dx ; Contents of dx is undefined, don't copy it to ds. 

當實模式程序(EXE或COM)啓動時,兩個段寄存器DS和ES都加載了PSP的段地址。 Cmdline參數在偏移量爲81h的PSP中可用。所以,是的,你可以第一個字符用

mov al,ds:[81h] 

但與

mov al, offset ds:[81h] 

,因爲你想在地址DS字節的內容加載到AL:[81H],而不是其偏移(數字81h)加載到AL。

+0

謝謝您的回答!我不小心寫了50h,但意味着51h:中斷返回寄存器BX中的PSP地址。一個問題:當我使用你的解決方案時,我所打印的只是「¶」字符。任何想法爲什麼? – pvdsp

+1

您確定使用** INT 51h **嗎?中斷列表說有不同:http://www.ctyme.com/intr/int-51.htm 當您的程序已啓動命令 ** YourPgm.com xy **, 在PSP:81的字節是在PSP中的字節:82h是x,在PSP處的字節:83h是y,在PSP處的字節:84h是0Dh(終止輸入)並且PSP處的字節:80h具有cmdline參數(在這種情況下爲03h)的長度。你應該學會使用調試器。 – vitsoft

+0

不幸的是,當運行** MyProgram xy **時,'ds:[81h]'返回「¶」字符,ds:[82h]不返回,ds:[83h]返回「≡」字符,不管我的命令行參數是什麼。 – pvdsp