Главная |
Статьи |
Ссылки |
Приколы |
Инфо... |
Режим отладки |
Эта статья не
претендует на новизну. Это моя
первая статья и описал кусок
кода который первый попался на
глаза. Подобное задание было на
втором туре олимпиады по по
системному програмированию. В процессорах семейства 8086 для управления режимом отладки существуют два прерывания INT1 и INT3. Вектор прерывания INT1 получает упраление после выполнения одной команды и в этом векторе можно получить всю необходимую информацию о точке прерывания и текущих флагах. По адресу ss:[sp+0] находится IP, ss:[sp+2] - CS, ss:[sp+4] - FLAGS __________¦ EFLAGS ¦ BP+6 параметры ¦ CS ¦ BP+4 __________¦ IP ¦ BP+2 лок. перем ¦ AX ¦ BP+0 __________ ¦ free ¦ свободно __________ ¦ free ¦ Включить STEP MODE можно с помощью установки флага TF в регистре FLAGS. При входе в обработчик прерывания INT1 TF автоматически сбрасывается чтобы не было рекурсивного входа после выполнения первой инструкции обработчика прерывания После выполнения команды iret флаги восстанавливаются из стека и продожается работа со следующей команды. Отключается STEP MODE с помощью сброса флага TF в регистре FLAGS. Сбросить или установить TF флаг можно двумя (или большим?) числом способов: 1) с помощью pushf/popf (сброс аналогично) pushf pop ax or ah, 1 ; set TF push ax popf 2) с помощью int handler (сброс аналогично) trace_on: push ax push bp mov bp, sp mov ax, [bp+8] or ah, 1 ; set TF mov [bp+8], ax pop bp pop ax iret Так как при вызове прерываний в стек помещается и регистр флагов, то в прерывании его можно изменить и при выполнении iret новое значение флаков попадет в EFLAGS. Стек при вызове прерывания trace_on выглядит так ------------ ¦ EFLAGS ¦ BP+8 параметры ¦ CS ¦ BP+6 ------------- ¦ IP ¦ BP+4 локальные ¦ AX ¦ BP+2+ ------------ ¦ BP ¦ BP+0 ¦ ========¦ ¦ free ¦ свободно ----------+ ¦ free ¦ L----------------- Перед вызовом прерывания необходимо установить обработчик прерывания (handler) mov ah, 25h mov al, 40h mov dx, offset trace_on int 21h Через трассировку проходит такой участок кода mov ax, 0 mov cx, 10 again: inc ax dec cx jne again Полностью код в файле trace.asm ,который собирается в с помощью команд tasm trace.asm tlink /t trace.obj Миха Красник Sat 10 Aug 05:22:49 2002 |