Управление процессами и нитями, страница 8

Результат выполнения такой же, как и в предыдущей программе:

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          ; Без. переход по адресу систем. обработчика

Результат выполнения:

Division by zero

Divide overflow

Таким образом, после завершения пользовательского обработчика осуществлена передача управления обработчику BIOS.