我在编写.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ä♦
答案 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开始读取用于启动程序的命令。