0

我在编写 .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ä♦
4

2 回答 2

2

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

mov ds, [2Ch]

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

于 2013-03-13T10:11:33.017 回答
0

请参阅 Wikipedia 上的Program_Segment_Prefix条目。

PSP 的段地址在程序执行时传入 DS 寄存器。
...
或者,在偏移量 100h 加载的 .COM 程序中,可以直接使用上面列出的偏移量来寻址 PSP。偏移量 000h 指向 PSP 的开头,0FFh 指向结尾,依此类推。

因此,您可以例如读取用于从偏移量 81h 及以后启动程序的命令。

于 2013-03-13T08:51:55.363 回答