Главная
Статьи
Ссылки
Приколы
Инфо...

Режим отладки

Эта статья не претендует на новизну. Это моя первая статья и описал кусок кода который первый попался на глаза. Подобное задание было на втором туре олимпиады по по системному програмированию.

В процессорах семейства 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

Hosted by uCoz