编写.com程序环境(NASM)

时间:2013-03-13 08:36:33

标签: assembly x86 nasm dos

我在编写.com程序的环境时遇到问题。我知道,当es指向psp的开头时,它被放置在es:2ch。这是我的代码:

    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ä♦

2 个答案:

答案 0 :(得分:2)

我记得,PSP:2Ch的“环境”是一个段地址。虽然我们无法使用立即数或寄存器加载segreg,但我们可以从内存中加载一个...

mov ds, [2Ch]

然后从偏移0开始循环。这将只打印第一个环境变量。当该循环结束时,检查另一个0.如果不是,再次运行循环(可能想要输入CR / LF)。当你到达双零时,会有另一个单词(?),然后是程序名称。当然,在这一点上我们已经失去了ds ...但是cs和es仍然指向我们原来的PSP,所以如果需要它可以很容易地恢复...

答案 1 :(得分:0)

请参阅维基百科的Program_Segment_Prefix条目。

  

执行程序时,PSP的段地址在DS寄存器中传递     ...
    或者,在偏移100h加载的.COM程序中,只需使用上面列出的偏移就可以直接寻址PSP。偏移000h指向PSP的开始,0FFh指向结束等等。

所以你可以,例如从偏移81h开始读取用于启动程序的命令。