Результат выполнения такой же, как и в предыдущей программе:
Division by zero_new
Данная программа реализована без использования стандартных функций DOS для получения и установке вектора int 0. В обработчике прерывания указатель команд смещается на 2 байта (столько занимает команда деления).
Передача управления обработчику BIOS
Необходимо организовать передачу управления обработчику BIOS после выполнения всех команд собственного прерывания, то есть для выхода из обработчика использовать команду безусловного перехода по адресу системного обработчика. Перед завершением программы восстановить вектор прерывания для обеспечения возможности повторного запуска программы.
print macro
push ax, dx
lea dx, #1
mov ah, 9
int 021
pop dx, ax
#em
jmp start
_msg db '? Division by 0', 13, 10, '$'
n_vect equ 0
old_v dd ?
start:
lea ax, new ; Установка нового вектора прерывания
mov dx, cs ; Сохранение старого
mov es, 0
es xchg w [n_vect * 4], ax
es xchg w [n_vect * 4 + 2], dx
mov w old_v, ax
mov w old_v + 2, dx
mov ax, 100
mov cl, 0
div cl
int 020
new:
print _msg
mov ax, w old_v ; Восстановление прежнего вектора
mov dx, w old_v + 2
es mov w [n_vect * 4], ax
es mov w [n_vect * 4 + 2], dx
jmp old_v ; Без. переход по адресу систем. обработчика
Результат выполнения:
Таким образом, после завершения пользовательского обработчика осуществлена передача управления обработчику BIOS.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.