Написание среды.com программы (NASM)
У меня проблемы с написанием окружения.com программы. Я знаю, это помещается в es:2ch, когда es указывает на начало psp. Вот мой код:
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 ответа
Насколько я помню, "среда" в PSP:2Ch является адресом сегмента. Хотя мы не можем загрузить сегрегат с немедленным или регистром, мы можем загрузить один из памяти...
mov ds, [2Ch]
Затем выполните цикл, начиная со смещения 0. Это напечатает только первую из ваших переменных окружения. Когда этот цикл завершится, проверьте еще на 0. Если нет, запустите ваш цикл снова (возможно, вы захотите добавить CR/LF). Когда вы добираетесь до двойного нуля, появляется другое слово (?), А затем имя программы. Конечно, в этот момент мы потеряли ds... но cs и es все еще указывают на нашу оригинальную PSP, поэтому ее можно легко восстановить, если это необходимо...
Смотрите запись http://en.wikipedia.org/wiki/Program_Segment_Prefix в Википедии.
Адрес сегмента PSP передается в регистр DS при выполнении программы.
...
В качестве альтернативы, в программах.COM, загруженных со смещением 100h, можно напрямую обращаться к PSP, просто используя смещения, перечисленные выше. Смещение 000h указывает на начало PSP, 0FFh указывает на конец и т. Д.
Таким образом, вы можете, например, прочитать команду, которая использовалась для запуска вашей программы со смещения 81h и далее.