СОДЕРЖАНИЕ
2. Программная модель микропроцессора 8086
2.4. Способы задания операндов команды
3. Основные понятия языка ассемблера
3.2. Директивы определения данных
4. Сегментированная модель памяти
4.3. Общая структура программы
5.1. Соглашению по описанию команд
5.6. Команды организации циклов
5.11. Команды управления микропроцессором
7. Разработка одномодульной программы
7.1. Трансляция и компоновка программы
8. Разработка многомодульных программ
8.1. Принципы разработки модулей
8.2. Расширенное применение директивы сегментации
Программирование микропроцессорных устройств
10. Программирование системного таймера
10.1. Описание таймера-счетчика 8254
10.3. Структура регистров таймера
11. Программирование контроллера прерываний
11.1. Механизм обработки прерываний
11.4. Контроллер прерываний 8259
11.5. Идентификация прерываний
11.6. Прерывания bios и ms-dos
12. Программирование параллельного порта
12.2. Работа с параллельным портом на низком уровне
12.3. Стандартные средства работы с параллельным портом
13. Программирование последовательного порта
13.1. Основы последовательной передачи данных
13.2. Последовательный интерфейс rs-232c
13.3. Универсальный асинхронный приемо-передатчик 8250
13.4. Порты асинхронного адаптера
13.5. Стандартные средства программирования последовательного порта
Табл. 92. Аппаратные прерывания в порядке приоритета.
|
Номер |
IRQN |
Описание прерывания |
|
8 |
IRQ0 |
Прерывание таймера, возникает с частотой 18.2 Гц. |
|
9 |
IRQ1 |
Прерывание от клавиатуры. Генерируется при нажатии и отпускании клавиши. Используется для чтения данных от клавиатуры. |
|
A |
IRQ2 |
Каскадирование аппаратных прерываний. |
|
70 |
IRQ8 |
Прерывание от часов реального времени. |
|
71 |
IRQ9 |
Прерывание от контроллера видеоадаптера. |
|
72 |
IRQ10 |
Зарезервировано. |
|
73 |
IRQ11 |
Зарезервировано. |
|
74 |
IRQ12 |
Зарезервировано. |
|
75 |
IRQ13 |
Прерывание от математического сопроцессора. |
|
76 |
IRQ14 |
Прерывание от контроллера жесткого диска. |
|
77 |
IRQ15 |
Зарезервировано. |
|
B |
IRQ3 |
Прерывание асинхронного порта COM2. |
|
C |
IRQ4 |
Прерывание асинхронного порта COM1. |
|
D |
IRQ5 |
Прерывание от контроллера жесткого диска. |
|
E |
IRQ6 |
Прерывание контроллера флоппи-диска по завершении операции. |
|
F |
IRQ7 |
Прерывание принтера. Генерируется принтером, когда он готов к выполнению очередной операции. |
Микросхема 8259 имеет три однобайтовых регистра, которые управляют 8 линиями аппаратных прерываний (рис. 42). Регистр запроса на прерывание IRR (Interrupt Request Register) устанавливает соответствующий бит, когда линия прерывания сигнализирует о запросе. Затем проверяется, не обрабатывается ли другое прерывание. Для этого контроллер запрашивает информацию от регистра обслуживания ISR (Interrupt Service Register). Регистр использует адреса портов 20h и A0h для первого и второго контроллера 8259 соответственно.
Перед вызовом прерывания проверяется регистр маски прерываний (Interrupt Mask Register, IMR), чтобы узнать, разрешено ли в данный момент прерывание данного уровня. Проверка связана с тем, что некоторые программы нежелательно прерывать, и они могут запретить аппаратные прерывания. Запрещение всех аппаратных прерываний необходимо при выполнении критических участков программного кода, а также при изменении вектора прерывания, чтобы избежать выполнения прерывания, когда вектор изменен только наполовину.

Рис. 42. Схема обработки аппаратного прерывания.
Регистр IMR определен за адресами 21h или A1h и предназначен только для записи. Если бит в этом порту установлен в 1, то прерывание с соответствующим номером будет запрещено. Для запрета определенных аппаратных прерываний следует установить биты регистра IMR, соответствующие номерам прерываний, выбранным для маскирования.
По завершении подпрограммы обработки прерывания разряд ISR должен быть установлен в нулевое состояние, соответствующий последнему обслуженному запросу с тем, чтобы была разрешена обработка прерываний с более низкими приоритетами, чем только что обработанное. Для этого в регистр ISR должен быть передан код 20h.
Регистр ISR позволяет получить содержимое регистров ISR и IRR. Код команды чтения регистра ISR равен 0Ah, регистра IRR – 0Bh. После выполнения команд содержимое регистров ISR и IRR доступно из портов 20h и A0h соответственно. Для получения содержимого регистра IMR необходимо выполнить чтение портов с адресами 21h или A1h.
Архитектура микропроцессоров семейства 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.
Системное программное обеспечение аппаратных компонент ПК находится в ПЗУ, расположенной на системной плате и носит название BIOS (Basic Input-Output System, базовая система ввода-вывода).
Система BIOS выполняет процедуру самопроверки POST, которая активизируется при включении питания или при системном сбросе, проверяет аппаратуру системы и инициализирует для нормальной работы некоторые узлы, а также содержит ряд системных сервисов, например, определения объема памяти, конфигурации внешних устройств, установки даты и времени суток.
Кроме того, BIOS управляет всеми прерываниями. Система BIOS строит таблицу прерываний (инициализирует векторы прерываний), выполняет прерывание INT 11h (получение списка присоединенного оборудования) и INT 12h (запрос размера физической памяти). Подпрограммы обработки прерываний находятся в модуле ПЗУ, в том же, что и процедура POST.
Среди прерываний BIOS для пользователя могут быть полезны функции прерывания 10h (вывод информации на дисплей), 13h (дисковые операции), 14h (обмен данными через последовательный порт), 16h (обмен данными с клавиатурой), 17h (функции вывода на печать), 1Ah (функции времени) и ряд других.
Прерывания в диапазоне от 20h до 27h закреплены за функциями операционной системы MS-DOS (табл. 93). Эти прерывания проще в использовании и менее машинно-зависимы, чем их BIOS аналоги. Например, многие функции прерывания INT 21h не имеют собственной реализации, а только транслируются в один или несколько вызовов функций BIOS. Дополнительную информацию по применению функций можно получить в [2,4,6].
Табл. 93. Прерывания операционной системы MS-DOS.
|
Номер |
Описание прерывания |
|
20 |
Завершение программы и передача управления операционной системе. |
|
21 |
Вызовы функций операционной системы MS-DOS. Вызов функции в соответствии с кодом в регистре AH. |
|
22 |
Адрес подпрограммы обработки завершения задачи. |
|
23 |
Адрес выхода при обработке комбинации Ctrl-Break. |
|
24 |
Адрес подпрограммы реакции на критическую ошибку. |
|
25 |
Абсолютное чтение с диска. |
|
26 |
Абсолютная запись на диск. |
|
27 |
Завершение программы с сохранением ее в памяти (резидентная программа). |
|
28-3F |
Зарезервированы для MS-DOS. |