Другие языки программирования и технологии

Почему строка всё-таки выводится, а отладчики "тупят" ?

;Код, взятый из книги Assembler Олега Калашникова

CSEG segment
org 100h
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG

start:
movsp, offset lab_1
movax, 9090h
pushax
int20h
lab_1:
movah, 9
movdx, offset msg
int21h
int20h

msg db 'WHAT ???$'
CSEG ends
end start
> Почему строка всё-таки выводится, а отладчики "тупят"

Не удивительно, ведь эта программа изменяет свой собственный код во время выполнения.

В режиме выполнения программы (не отладки) после выполнения команды push ax программа в памяти будет выглядеть так:
start:
    mov sp, offset lab_1
    mov ax, 9090h
    push ax
    nop
    nop
lab_1:
    mov ah, 9
    mov dx, offset msg
    int 21h
    int 20h

А после выполнения команды int 21h:
;Мусор, записанный в стек при вызове обработчика прерывания 21h
    nop
    nop
lab_1:
    mov ah, 9
    mov dx, offset msg
    int 21h
    int 20h

При работе же в режиме отладки всё ещё более интересно.
Так как вершина стека устанавливается "внутрь" программы после выполнения первой команды mov sp, offset lab_1, то пошаговое выполнение последующих команд сопровождается установкой breackpoints (обычно это команда int3) с последующей передачей управления отладчику. При этом в стеке, который теперь перекрывает начало программы до метки lab_1, постоянно сохраняется содержимое регистров и адреса возврата, полностью перезаписывая начало программы в общем-то случайными данными.
На этой особенности отладчиков основаны методы борьбы с трассировкой программ. При нормальном выполнении программы логика работы не нарушается, а при отладке часть программы затирается стеком.
Rahat Kamerhan
Rahat Kamerhan
51 590
Лучший ответ
Досовские отладчики под виндой (NT, 2000, XP, Vista, 7) не работают, ставь чистый DOS на виртуалку и там играйся. Можешь попробовать запускать в DosBox, но не уверен, что там все будет нормально.
Gion Arsel
Gion Arsel
53 875
> Досовские отладчики под виндой (NT, 2000, XP) не работают

Нагло врешь.

vm86-машина встроена и нормально работает в NT, 2000, XP.
Юра Гусев
Юра Гусев
5 551