2013-03-13 82 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