Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_MET_2.DOC
Скачиваний:
13
Добавлен:
02.05.2019
Размер:
689.66 Кб
Скачать
      1. Обработчики прерываний

Вызов программных прерываний осуществляется синхронно, то есть на момент возникновения прерывания точно определено программное состояние системы. Кроме того, при этом не используется контроллер прерываний и специфические особенности устройств. В силу этого структура обработчика программного прерывания оказывается простой. Пример обработчика программного прерывания, обнуляющего регистр AX:

int_handler proc far

mov ax, 0

iret

int_handler endp

После того как обработчик написан, следующий шаг — привязка его к выбранному номеру прерывания. Это можно сделать, прямо записав его адрес в таблицу векторов прерываний, однако лучше пользоваться специальными функциями DOS для работы с векторами:

Функция DOS 25h — Установить вектор прерывания

Ввод: АН = 25h

АL = номер устанавливаемого вектора

DS:DX = адрес обработчика прерывания

Вывод: нет

Функция DOS 35h — Получить содержимое вектора прерывания

Ввод: АН = 35h

АL = номер вектора (прерывания)

Вывод: ES:BX = содержимое вектора (адрес обработчика прерывания)

Установка обработчика из примера выше будет выглядеть так:

mov ah, 25h ; установить обработчик

mov al, 87h ; прерывания 87h

mov dx, seg int_handler ; сегментный адрес

mov ds, dx ; в DS

mov dx, offset int_handler ; смещение в DX

int 21h

Теперь команда INT 87h будет вызывать наш обработчик, то есть при­водить к записи 0 в регистр АХ.

Перед завершением работы программа должна восстановить все старые обработчики прерываний, даже если это были неиспользуемые прерывания типа 87h, иначе обращение по этим векторам после выгрузки обработчика приведет к нарушению работы ОС. Для этого надо перед предыдущим фрагментом кода сохранить адрес старого обработчика, так что полный набор дей­ствий для программы, перехватывающей прерывание 87h, будет выгля­деть следующим образом:

; скопировать адрес предыдущего обработчика в переменную old_handler

mov ax, 3587h ; АН = 35h, AL = номер прерывания

int 21h ; считать адрес обработчика прерывания

mov word ptr old_handler, bx ; сохранить смещение

mov word ptr old_handler+2, es ; и сегментный адрес

; установить наш обработчик

mov ax, 2587h ; АН = 25h, AL = номер прерывания

mov dx, seg int_handler

mov ds, dx

mov dx, offset int_handler

int 21h

, восстановить предыдущий обработчик

Ids dx, old_handler ; сегментный адрес в DS и смещение в DX

mov ax, 2587h

int 21h

При помощи собственных обработчиков исключений можно обрабатывать особые ситуации (исключения), которые могут происходить в программе, например деление на ноль. В реальном режиме можно столкнуться всего с шестью ис­ключениями:

#DE (деление на ноль) — INT 0 — ошибка, возникающая при переполне­нии и делении на ноль. Как для любой ошибки, адрес возврата ука­зывает на ошибочную команду.

#DB (прерывание трассировки) — INT 1 — ловушка, возникающая после выполнения каждой команды, если флаг TF установлен в 1. Исполь­зуется отладчиками, действующими в реальном режиме.

#OF (переполнение) — INT 4 — ловушка, возникающая после выполне­ния команды INTO, если флаг OF установлен.

#ВС (переполнение при BOUND) — INT 5 — ошибка, возникающая при выполнении команды BOUND.

#UD (недопустимая команда) — INT 6 — ошибка, возникающая при по­пытке выполнить команду, отсутствующую на данном процессоре.

#NM (сопроцессор отсутствует) — INT 7 — ошибка, возникающая при попытке выполнить команду FPU, если FPU отсутствует.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]