Прежде чем мы рассмотрим первый пример программы, использующей DPMI, остановимся еще на одной группе его функций — операции с обработчиками прерываний. Когда происходит прерывание или исключение, управление передается сначала по цепочке обработчиков прерываний в защищенном режиме, последний обработчик — стандартный обработчик DPMI — переходит в режим V86, а затем управление проходит по цепочке обработчиков прерывания в реальном режиме (в реальном режиме обработчики прерываний и исключений совпадают).
INT 31h, AX = 0200h — Определить адрес реального обработчика прерывания
Ввод: | АХ = 0200h BL = номер прерывания |
Вывод: | CF = 0 всегда, CX:DX — сегмент:смещение обработчика прерывания в реальном режиме |
INT 31h, АХ = 0201h — Установить реальный обработчик прерывания
Ввод: | АХ = 0201h BL = номер прерывания CX:DX = сегмент:смещение обработчика прерывания в реальном режиме |
Вывод: | CF = 0 всегда |
INT 31h, АХ = 0204h — Определить адрес защищенного обработчика прерывания
Ввод: | АХ = 0204h BL = номер прерывания |
Вывод: | CF = 0 всегда, CX:EDX = селектор:смещение обработчика |
INT 31h, АХ = 0205h — Установить защищенный обработчик прерывания
Ввод: | АХ = 0205h BL = номер прерывания CX:EDX = селектор:смещение обработчика |
Вывод: | CF = 0 |
INT 31h, АХ = 0202h — Определить адрес обработчика исключения
Ввод: | АХ = 0202h BL = номер исключения (00h – 1Fh) |
Вывод: | если CF = 0, CX:EDX = селектор:смещение обработчика исключения |
INT 31h, АХ = 0203h — Установить обработчик исключения
Ввод: | АХ = 0203h BL = номер исключения (00h – 1Fh) CX:EDX = селектор:смещение обработчика исключения |
Вывод: | CF = 0, если не было ошибок |
Если обработчик исключения передает управление дальше по цепочке на стандартный обработчик DPMI-сервера, следует помнить, что только исключения 0, 1, 2, 3, 4, 5 и 7 передаются обработчикам из реального режима, а остальные исключения приводят к прекращению работы программы.