- •Системное программирование
- •Контрольные вопросы
- •2. Программная модель микропроцессора 8086
- •2.1. Представление информации
- •2.2. Регистры микропроцессора
- •2.3. Формат машинной команды
- •2.4. Способы задания операндов команды
- •Контрольные вопросы
- •3. Основные понятия языка ассемблера
- •3.1. Предложения
- •3.2. Директивы определения данных
- •3.3. Выражения
- •Контрольные вопросы
- •4. Сегментированная модель памяти
- •4.1. Сегментирование адресов
- •4.2. Директивы сегментации
- •4.3. Общая структура программы
- •4.4. Модели памяти
- •Контрольные вопросы
- •5. Основные группы команд
- •5.1. Соглашению по описанию команд
- •5.2. Команды пересылки данных
- •5.3. Арифметические команды
- •5.4. Логические команды
- •5.5. Команды переходов
- •5.6. Команды организации циклов
- •5.7. Команды обработки строк
- •5.8. Стековые команды
- •5.9. Команды ввода-вывода
- •5.10. Команды прерываний
- •5.11. Команды управления микропроцессором
- •Контрольные вопросы
- •6. Подпрограммы
- •Контрольные вопросы
- •7. Разработка одномодульной программы
- •7.1. Трансляция и компоновка программы
- •7.2. Отладка программы
- •Контрольные вопросы
- •8. Разработка многомодульных программ
- •8.1. Принципы разработки модулей
- •8.2. Расширенное применение директивы сегментации
- •9. Упражнения
- •Контрольные вопросы
- •Программирование микропроцессорных устройств
- •10. Программирование системного таймера
- •10.1. Описание таймера-счетчика 8254
- •10.2. Режимы работы таймера
- •10.3. Структура регистров таймера
- •10.4. Упражнения
- •Контрольные вопросы
- •11. Программирование контроллера прерываний
- •11.1. Механизм обработки прерываний
- •11.2. Типы прерываний
- •11.3. Приоритеты прерываний
- •11.4. Контроллер прерываний 8259
- •11.5. Идентификация прерываний
- •11.6. Прерывания bios и ms-dos
- •11.7. Упражнения
- •Контрольные вопросы
- •12. Программирование параллельного порта
- •12.1. Интерфейс Centronics
- •12.2. Работа с параллельным портом на низком уровне
- •12.3. Стандартные средства работы с параллельным портом
- •12.4. Упражнения
- •Контрольные вопросы
- •13. Программирование последовательного порта
- •13.1. Основы последовательной передачи данных
- •13.2. Последовательный интерфейс rs-232c
- •13.3. Универсальный асинхронный приемо-передатчик 8250
- •13.4. Порты асинхронного адаптера
- •13.5. Стандартные средства программирования последовательного порта
- •13.6. Упражнения
- •Контрольные вопросы
- •Литература
- •141 Кафедра Вычислительной Техники и Программирования Московского Государственного Открытого Университета
11.5. Идентификация прерываний
Архитектура микропроцессоров семейства 8086 не позволяет однозначно идентифицировать источники некоторых прерываний по вектору. Например, прерывание по вектору 0 может произойти по одной из следующих причин:
по обнаружению ошибки во время выполнения инструкций деления DIV и IDIV;
по инструкции INT 0;
при поступлении сигнала внешнего маскируемого прерывания, сопровождаемого передачей нулевого номера вектора прерывания.
Контроллер прерываний на базе микросхем типа 8259 фиксирует факт обслуживания прерывания по каждой из своих линий запросов прерываний. Обработчик прерывания должен проверить состояние соответствующего регистра контроллера прерываний, чтобы определить, является ли причиной прерывания внешний запрос или программное событие.
Если данному вектору прерывания не соответствует какая-либо линия запроса внешнего прерывания (IRQ), то и произойти это прерывание по внешнему запросу не могло. Рассмотрим способы анализа нескольких первых видов прерываний.
Прерывание по вектору 0. Сохранённый в стеке адрес будет указывать на команду деления, вызвавшую прерывание, в то время как при выполнении инструкции INT 0 – на следующую за ней инструкцию, которая также может оказаться командой деления. Необходимо проанализировать код команды, на которую указывает сохранённый в стеке адрес инструкции – если это не команда деления, то причиной прерывания является инструкция INT 0.
Если сохранён адрес команды деления, то требуется проверка её параметров. Если они окажутся корректными, то прерывание возникло из-за инструкции INT 0, непосредственно предшествующей команде деления. Если параметры некорректны, причиной могла послужить и предшествовавшая инструкция INT 0, и инструкция деления.
Прерывание по вектору 1. Чтобы определить, произошло ли прерывание по вектору 1 в результате трассировки выполнения программы с помощью флага TF или из-за выполнения инструкции INT 1, необходимо проверить состояние флага TF, сохранённом в стеке в процессе прерывания.
Если флаг сброшен, прерывание было вызвано инструкцией INT 1. Если флаг установлен, то имело место прерывание трассировки, что, однако, не исключает вероятности того, что одновременно была выполнена и инструкция INT 1. Однозначная идентификация в такой ситуации невозможна по той же причине, что и для вектора 0.
Прерывание по вектору 2. Прерывание может произойти либо при поступлении внешнего сигнала немаскируемого прерывания NMI, либо при выполнении двухбайтовой команды INT 2. Однозначная идентификация возможна только в случае, если аппаратура микропроцессорной системы обеспечивает программно-доступную фиксацию сведений о возникшем немаскируемом прерывании.
Прерывания по векторам 3 и 4. Прерывания могут быть программно однозначно идентифицированы: они происходят либо из-за выполнения однобайтовых инструкций INT 3 и INTO (коды CC и CE соответственно), либо из-за двухбайтовых инструкций INT 3 и INT 4 (коды CD 03 и CD 04 соответственно).
Таким образом, в связи с отсутствием однозначной идентификации при возникновении прерывания его обработчик должен определить конкретную причину возникновения прерывания. В общем случае невозможно точно идентифицировать источник прерывания по векторам 0–2.