Написание среды.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 и далее.

Другие вопросы по тегам