СОДЕРЖАНИЕ
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. Стандартные средства программирования последовательного порта
Прерывания могут возникать вследствие внешних событий (внешние прерывания), генерироваться специальными инструкциями (программные прерывания), либо из-за ошибок, возникающих в процессе выполнения программы (исключений). Независимо от типа прерывания микропроцессор обрабатывает их одинаково.
Внешние прерывания возникают вне микропроцессора. Запросы прерываний поступают по специальным входным линиям микросхемы микропроцессора. Внешние прерывания инициируются аппаратурой. Они могут быть вызваны сигналом микросхемы таймера, сигналом от принтера, нажатием клавиши на клавиатуре и множеством других причин. Внешние прерывания не координируются с работой программного обеспечения. Различают немаскируемые и маскируемые внешние прерывания.
Немаскируемые прерывания. Микропроцессор извещается о возникновении немаскируемого внешнего прерывания с помощью сигнала, поступающего по его линии NMI (Non Mask Interrupt). Получив сигнал, микропроцессор после выполнения очередной инструкции производит переход по вектору 2, постоянно назначенному для немаскируемых прерываний.
Обычно немаскируемое прерывание используется для извещения о возникновении тех или иных неисправностей, делающих невозможным нормальное продолжение работы, например, при обнаружении сбоя оперативной памяти.
Когда происходит немаскируемое прерывание, микропроцессор блокирует обработку новых запросов немаскируемых прерываний до тех пор, пока не будет выполнена инструкция возврата из прерывания IRET. Таким образом, немаскируемые прерывания не могут быть «вложенными».
Немаскируемое прерывание не может быть маскировано (игнорировано) средствами самого микропроцессора. Однако обычно имеются внешние по отношению к микропроцессору схемы, позволяющие запретить немаскируемые прерывания путём блокировки прохождения сигнала по линии NMI.
Маскируемые прерывания. Сигнал о запросе маскируемого прерывания поступает в микропроцессор по линии INT. Выполнение текущей инструкции завершается обычным образом и в стеке сохраняется адрес следующей инструкции.
Маскируемые прерывания могут быть запрещены средствами самого микропроцессора – для этого в регистре флагов должен быть сброшен флаг прерываний IF. В таком случае микропроцессор игнорирует сигнал на линии INT и продолжает выполнять инструкции в обычном порядке. Однако когда этот флаг установлен и поступает запрос маскируемого прерывания, микропроцессор завершает выполнение текущей инструкции, после чего передаёт управление подпрограмме обработки прерывания.
Ассемблерная команда CLI сбрасывает флаг прерываний IF, а команда STI вновь его устанавливает. Вызовы этих команд должны быть сбалансированы, и всегда завершаться вызовом команды STI. В противном случае, система окажется недоступной для управления. Кроме того, не следует сбрасывать флаг прерываний IF на время, превышающее период следования импульсов от таймера-счетчика, т.к. иначе операции, зависящие от времени, будут выполняться некорректно.
В отличие от немаскируемых прерываний, маскируемым не назначается какой-либо фиксированный вектор прерывания. Вместо этого микропроцессор, начиная процедуру выполнения маскируемого прерывания, выдаёт сигнал INTA, получив который, устройство, запросившее прерывание, передает микропроцессору один байт информации, являющийся номером вектора прерывания, которое должно быть выполнено. Для обработки маскируемых прерываний можно использовать до 256 векторов.
Компания Intel зарезервировала векторы 0–31 для внутренних нужд микропроцессора. Поэтому настоятельно не рекомендуется использовать инструкции INT с номерами 0–31, а также назначать этим векторам маскируемые аппаратные прерывания.
Программные прерывания представляют обычные подпрограммы, которые вызываются прикладными программами для обработки нажатий клавиш на клавиатуре, событий от таймера, вывода сообщений на экран и других действий. Однако эти подпрограммы относятся не к прикладной программе пользователя, а к операционной системе.
Программные прерывания могут быть вложенными. Они инициируются командой INT с номером от 0 до 0FFh. Базовая система ввода-вывода BIOS и операционная система MS-DOS предоставляют множество функций в виде программных прерываний. Некоторые программные прерывания обеспечивают несколько функций. Например, большинство полезных для пользователя функций MS-DOS закреплено за прерыванием 21h. Номер конкретной функции должен быть указан в регистре AH, а подфункции – в регистре AL.
Аппаратное прерывание может получить управление при выполнении программного. При этом не возникает конфликтов, т.к. каждая подпрограмма обработки прерывания сохраняет значения всех используемых регистров и затем восстанавливает их при выходе. Схема обработки программного прерывания показана на рис. 41

Рис. 41. Схема обработки программного прерывания.
Прерывания по исключению разделяются на несколько видов – исключения по ошибке деления, по точке остановка, по переполнению и по трассировке.
Прерывание по ошибке деления возникает при выполнении инструкции DIV или IDIV, если результат превышает максимально допустимую величину, а также при попытке деления на ноль. В результате управление передаётся обработчику прерывания по вектору 0.
Прерывание по точке останова возникает, если в программе встретилась инструкция INT 3. Выполнение инструкции приводит к передаче управления обработчику прерывания по вектору 3. Система команд микропроцессора 8086 обеспечивает два формата инструкции INT 3 – однобайтовый (код команды CC) и двухбайтовый (код команды CD 03). Функционально они не отличаются, но двухбайтовый формат принято относить к программным прерываниям, а однобайтовый – к исключениям.
Прерывание по переполнению происходит, если при выполнении инструкции INTO установлен флаг переполнения OF. Когда флаг сброшен, инструкция INTO не производит никаких действий. Обработчик прерывания по переполнению использует вектор 4.
Прерывания по трассировке происходят после выполнения каждой инструкции, когда в регистре флагов установлен флаг трассировки TF. В этом случае, завершив выполнение инструкции, микропроцессор передаёт управление обработчику прерывания по вектору 1.
Особенностью микропроцессоров семейства 8086 является то, что после установки флага трассировки связанное с ним прерывание происходит не после инструкции, в ходе выполнения которой этот флаг был установлен, а по завершении следующей за ней инструкции.
Например, если при завершении обработчика прерывания по трассировке с помощью команды IRET в восстановленном содержимом регистра флагов флаг TF окажется установлен, то новое прерывание по трассировке произойдёт не сразу после выполнения инструкции IRET, а по завершении команды, на которую инструкцией IRET будет возвращено управление.
Одновременно может возникать несколько запросов на прерывание, поэтому микропроцессор должен обслуживать их в соответствии с приоритетом. Сначала обслуживаются прерывания с высоким приоритетом, а затем – с более низким. Максимальный приоритет соответствует уровню 0 и убывает с возрастанием номера.
Высший приоритет имеют исключения деления, точки останова и переполнения и программные прерывания. Они взаимно исключают друг друга, т.е. могут произойти при выполнении только определённых инструкций микропроцессора. Поэтому ситуации, когда необходимо обслужить одновременно несколько прерываний этих видов, возникнуть не может. Затем по приоритету следует немаскируемое внешнее прерывание, и потом маскируемые внешние прерывания. Самый низкий приоритет имеет трассировочное прерывание.
Внешние устройства не выдают запросы прерываний напрямую микропроцессору, а передают их специальной микросхеме – контроллеру прерываний, который способен обслуживать запросы прерываний сразу от нескольких устройств и обеспечивает выдачу соответствующих векторов. Заметим, что микропроцессор не задает необходимость обязательного использования контроллера прерывания. Можно разработать систему, в которой каждое устройство будет самостоятельно выдавать определённый для него вектор прерывания. Однако при этом необходимо будет решать вопрос приоритетности прерываний.
В IBM PC совместимых устройствах используется микросхема программируемого котроллера прерываний Intel 8259 (отечественный аналог КР580ВН59 или КР1810ВН59А) для обслуживания запросов прерываний от различных устройств. Контроллер обеспечивает восемь векторов.
Запрос на прерывание обозначается как IRQ (Interrupt Request) с соответствующим порядковым номером. Для IBM PC XT существует 8 уровней приоритетов, а для IBM PC AT и последующих серий – 16. Обращения к соответствующим уровням обозначаются сокращениями от IRQ0 до IRQ7 (или от IRQ0 до IRQ15), что означает запрос на прерывание.
Микросхемы контроллера прерываний можно объединять (каскадировать) для увеличения количества уровней приоритетов. При этом общее число уровней прерываний будет достигать 64. Запросы на прерывание 0-7 соответствуют векторам прерываний от 8H до 0FH, запросы на прерывания 8-15 – векторами от 70H до 77H. В табл. 92 приведены назначения этих прерываний.