;Код, взятый из книги 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, постоянно сохраняется содержимое регистров и адреса возврата, полностью перезаписывая начало программы в общем-то случайными данными.
На этой особенности отладчиков основаны методы борьбы с трассировкой программ. При нормальном выполнении программы логика работы не нарушается, а при отладке часть программы затирается стеком.
Не удивительно, ведь эта программа изменяет свой собственный код во время выполнения.
В режиме выполнения программы (не отладки) после выполнения команды 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, постоянно сохраняется содержимое регистров и адреса возврата, полностью перезаписывая начало программы в общем-то случайными данными.
На этой особенности отладчиков основаны методы борьбы с трассировкой программ. При нормальном выполнении программы логика работы не нарушается, а при отладке часть программы затирается стеком.
Досовские отладчики под виндой (NT, 2000, XP, Vista, 7) не работают, ставь чистый DOS на виртуалку и там играйся. Можешь попробовать запускать в DosBox, но не уверен, что там все будет нормально.
> Досовские отладчики под виндой (NT, 2000, XP) не работают
Нагло врешь.
vm86-машина встроена и нормально работает в NT, 2000, XP.
Нагло врешь.
vm86-машина встроена и нормально работает в NT, 2000, XP.
Похожие вопросы
- Почему-же все-таки кодеры токсичны?
- Дизассемблер и отладчик.
- Как дополнить программу чтобы выводилось еще не просто какая строка длинее,но и еще насколько
- Почему php-код( т. е. теги кода) выводится в браузере, а не исполняется?
- Почему разработчики не доработали возможность полноценной работы с компьютером в командной строке ?)
- То ли я блондинка, то ли оно всё-таки тупит...
- QBASIC сформировать мосив состоящая С М-строк,и М-столбцов
- как в delphi сделать чтобы при нажатии на определенную кнопку выводился другой символ??
- паскаль... строки...функция delete. не подскажете, почему в этой программе она не выполняется,что опять не так тут?(((
- ассемблер, проверка длины строки