Описание процессора i8086 для программиста


Идентификация источников прерываний


К сожалению, архитектура процессоров семейства 80x86 не позволяет однозначно идентифицировать источник прерывания по его вектору. Например, прерывание по вектору 0 может произойти по одной из следующих причин:

– по обнаружению ошибки во время выполнения инструкций деления DIV и IDIV (“штатная” причина для прерывания по этому вектору);

– по инструкции INT 0;

– при поступлении сигнала внешнего маскируемого прерывания, сопровождаемого передачей нулевого номера вектора прерывания[5].

В связи с отсутствием однозначной идентификации при возникновении прерывания его обработчик должен определить конкретную причину возникновения прерывания. Способ идентификации определяется программистом, однако в любом случае следует обратить внимание на следующие моменты.

Используемый в персональных компьютерах контроллер прерываний на базе микросхем типа 8259 (эмулируемый современными чипсетами) фиксирует факт обслуживания прерывания по каждой из своих линий запросов прерываний. Обработчик прерывания должен проверить состояние соответствующего внутреннего регистра контроллера прерываний, чтобы определить, послужил ли причиной прерывания внешний запрос или какое-нибудь событие внутри программы. Естественно, что если данному вектору прерывания не соответствует какая-либо линия запроса внешнего прерывания (IRQ), то и произойти это прерывание по внешнему запросу не может.

При прерывании по ошибке деления (вектор 0) сохранённый в стеке адрес будет указывать на команду деления, вызвавшую прерывание, в то время как при выполнении инструкции INT 0 – на следующую за ней инструкцию, которая также может оказаться командой деления. Необходимо проанализировать код команды, на которую указывает сохранённый в стеке адрес инструкции – если это не команда деления, то причиной прерывания является инструкция INT 0. Если же сохранён адрес команды деления, то требуется “ручная” проверка её параметров. Если они окажутся корректными, то прерывание возникло из-за инструкции INT 0, непосредственно предшествующей команде деления.


- Начало -  - Назад -  - Вперед -