2013-03-13 81 views
0

我在編寫.com程序的環境時遇到了問題。我知道,當es指向psp的開始時,它被放置在es:2ch。這裏是我的代碼:編寫.com程序的環境(NASM)

org 100h 
    mov cx,256 
    mov ah,2 


    xor si, si ; si = 0 
    mov si,[es:si] ; si = begining of the psp 
    sub si, 2ch ; adding 2ch offset to si 
    mov si, [si] ; making si point to com environement 



loop1: ; output chars until '0' 
    mov dl, [si] 
    inc si  
    cmp dl, '0' 
    je end_of_program   
    int 21h 

loop loop1 



end_of_program: 
    mov ah, 0 
    int 16h 

    mov ah, 4ch 
    int 21h 

輸出:

R♥˙{ T♥ |  `♦­☺Ç☻ ▼ ţ☺ IT 
♦☻ NLł☻ PO┬☺ NO×☻ CFÓ☻ SV┤☻ SU╩☻ LA▲♥ DV4♥ RU÷☻ BRJ♥ 
HUĘ♥ ISż♥ PLď♥ ROŕ♥ SL ♦ YU▬♦ TRB♦ ETn♦ JPX♦ USä♦ 

回答

0

看到維基百科的Program_Segment_Prefix條目。

執行程序時,PSP的段地址被傳遞到DS寄存器中。
...
或者,在偏移100h加載的.COM程序中,只需使用上面列出的偏移量即可直接尋址PSP。偏移000h指向PSP的開始,0FFh指向末尾等。

因此,您可以讀取從偏移量81h開始用於啓動程序的命令。

2

我記得,PSP:2Ch的「環境」是一個段地址。雖然我們無法加載與立即一個segreg或註冊,我們可以加載一個從內存...

mov ds, [2Ch] 

然後做你的循環從偏移0開始,這僅打印你的環境變量。當該循環結束時,檢查另一個0.如果沒有,再次運行你的循環(可能想要拋出一個CR/LF)。當你到達雙零點時,還有另一個單詞(?),然後是程序名。當然,在這一點上,我們已經失去了ds ...但是CS和ES都指向我們的原始PSP,所以它可以很容易地恢復,如果需要的話...

+0

那麼我的輸出OK?它是第一個變量,它應該是這樣嗎? – Patryk 2013-03-19 12:14:39