Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции препода / Лекции для 3 курса.doc
Скачиваний:
82
Добавлен:
30.04.2013
Размер:
1.51 Mб
Скачать

Лекция 9. Прерывания

В большинстве современных процессоров имеются средства прерыва­ния их внешними устройствами. Они освобождают процессор от периоди­ческой проверки необходимости обслуживания устройств. Например, вместо того, чтобы заставить процессор часто опрашивать клавиатуру, не нажата ли клавиша, и большую часть времени получать отрицательные ответы, гораздо эффективнее разрешить процессору игнорировать клавиа­туру, но позволить клавиатуре привлекать внимание процессора при нажатии клавиши. Первый способ называется опросом (полингом), а второй - прерыванием.

Механизм прерываний. Процессор 80286 имеет два входа, по которым внешние устройства могут привлечь его внимание: вход NMI немаскируемого прерывания и вход INTR маскируемого прерывания. Рассмотрим вначале вход NMI. Когда внешнее устройство формирует сигнал на входе NMI, процессор прекращает свои действия (но не в середине команды) и реагирует на прерывание. Однако процессор может выполнять очень важную задачу, поэтому внешние устройства не должны прерывать процес­сор по входу NMI за исключением появления катастрофических событий. Примером таких событий служит сообщение о том, что напряжение сети упало до 100 В и продолжает уменьшаться, т.е. возник "отказ сети". Ясно, что внешнее устройство должно известить процессор о том, что ему оста­лось "недолго жить". За несколько оставшихся миллисекунд процессор может привести "свои дела в порядок" (например, передать важные результаты в безопасное место), прежде чем генератор синхронизации остановится. Если таких катастрофических событий нет, внешнее устройст­во имеет возможность прервать процессор по входу INTR. Процессор может проигнорировать этот входной сигнал. Реакция зависит от состоя­ния флажка разрешения прерываний IF; когда IF = 0, процессор не реагиру­ет на входные сигналы INTR. Говорят, что прерывания разрешены, если IF = 1, и запрещены, если IF = 0. Команды, воздействующие на флажок IF, мы рассмотрим далее.

Кроме сигнала на входе INTR, внешнее устройство должно сообщить процессору причину прерывания. Причин прерываний по входу INTR может быть довольно много (например, до 256), а причина прерывания по входу NMI всего одна (надвигающаяся катастрофа). Поэтому по запросу процессора внешнее устройство сообщает число из диапазона 0 ... 255, соответствующее причине прерывания по входу INTR и называемое типом прерывания. Для каждого типа прерывания у процессора есть программа, которую он должен выполнить до возобновления прерванной задачи. Адреса этих программ находятся в 256-элементной таблице. Каждый ее элемент состоит из четырех байт и содержит значения регистров IP и CS, соответствующие началу программ для конкретных типов прерываний. Таблица начинается с адреса памяти 0, как показано на рис. 3.17. Програм­мы, выполняющиеся при возникновении прерываний, часто называются процедурами прерываний.

Рассмотрим действия процессора, когда он воспринимает сигнал INTR и прерывания разрешены (IF = 1). После завершения текущей команды процессор прекращает свои операции и готовится выполнить процедуру прерывания конкретного типа. Прежде всего он сохраняет всю важную информацию о своих действиях, чтобы по завершении процедуры прерыва­ния их можно было возобновить. Удобно сохранить эту информацию в стеке.

Сохраняет же процессор текущие состояния всех флажков и текущее содержимое регистровIP и CS.

Затем процессор получает от внешнего устройства тип прерывания и помещает в IP и CS элементы таблицы, соответствующие этому типу прерывания. Предположим, например, что внешнее устройство сообщает о типе прерывания 01. В этом случае в регистр IP помещается 16-битное значение по адресу 00004, а в CS - 16-бит­ное значение по адресу 00006. Поэтому следующей будет выполняться первая команда процедуры прерывания, соответствующей типу преры­вания 1.

Когда процессор воспринимает прерывание по входу NMI (независимо от состояния флажка IF), он реагирует на него так же, как на прерывание по входу INTR, за одним исключением. Ему не нужно получать от внешне­го устройства тип прерывания, так как причина прерывания по входу NMI всего одна. Для локализации процедуры прерывания NMI отведен элемент с типом 2 в таблице прерываний; поэтому в регистры IP и CS помещаются элементы таблицы для типа 2.

Итак, мы рассмотрели прерывания, формируемые внешними устройст­вами, и их естественно называть внешними прерываниями. Но процессор сам генерирует внутренние прерывания, если при выполнении некоторых команд происходит что-то неожиданное. Такие неожиданные события называются особыми случаями, и они обычно свидетельствуют о серьезной ошибке. Например, команды деления вызывают прерывание типа 0, если делитель равен нулю. Следовательно, в таблице элемент для типа 0 (еще один зарезервированный тип прерывания) должен содержать значения для регистров IP и CS процедуры прерывания, которая обрабатывает такую ситуацию.

Первый 31 элемент в таблице прерываний зарезервирован для внутрен­них прерываний и прерывания NMI. Они показаны на рис. 3.18. Микропро­цессор 8086 генерирует только первые пять внутренних прерываний. Ни одно из зарезервированных прерываний не зависит от состояния флажка разрешения прерываний IF.

Еще одним примером неожиданного результата является знаковое переполнение. Однако при этом процессор не генерирует внутреннего прерывания. Объясняется это тем, что в знаковой и беззнаковой арифмети­ке применяется одна и та же команда ADD и процессор не знает, выполня­лось ли фактически знаковое сложение (это же относится и к вычитанию). Но в процессоре предусмотрена однобайтная команда INTO, которая генерирует прерывание типа 4, если флажок переполнения OF = 1. Ее нужно вводить после каждой арифметической команды со знаковыми числами, если существует потенциальная возможность возникновения переполнения.

Внутреннее прерывание типа 6 генерируется, если встречается недейст­вительная операция. Другие внутренние прерывания, показанные на рис. 3.18, мы рассмотрим в дальнейшем.

Обратимся теперь к самой процедуре прерывания. Она может не заботиться о состояниях флажков, так как они запомнены в стеке. Но если процедура прерывания изменяет любые другие важные данные (которые будут использоваться прерванной программой, например, содержимое регистра АХ), она должна вначале сохранить их. Перед завершением процедура прерывания должна восстановить запомненные ею важные данные. Наконец, процедура прерывания заканчивается выполнением команды IRET (возврат из прерывания), которая восстанавливает из стека запомненное содержимое регистров IP, CS и флажков. Отметим, что воз­врат из прерывания отличается от межсегментного возврата только восста­новлением состояний флажков, но обе команды возвращают содержимое регистров IP и CS.

Обычно с прерываниями ассоциируется и команда останова HLT. Она прекращает действия процессора, причем содержимое регистров CS и IP показывает на команду после HLT. Когда возникает прерывание, процес­сор сохраняет в стеке эти значения из регистров CS и IP и начинает выпол­нять команды процедуры прерывания. Когда встречается команда IRET, запомненные значения регистров CS и IP восстанавливаются. Теперь процессор не помнит, что ранее он ожидал прерывания. Поэтому он продолжает выполнять команду, на которую показывают регистры CS и IP, т.е. команду, следующую за командой HLT. По существу, команда HLT превра­щается в средство запуска процессора процедурой прерывания.

Таким образом, до 256 процедур прерываний находятся в разных областях памяти и ожидают появления прерываний, которые приводят их в действие. Некоторые из них удобно вызывать и тогда, когда прерываний нет. Поскольку значения в регистрах CS и IP, необходимые для выполне­ния процедур, находятся в четырех смежных байтах памяти, можно вызвать процедуру прерывания, выполнив команду косвенного межсег­ментного вызова, которая определяет эти четыре байта. Но здесь кроется опасность! Ведь процедура

прерывания не заканчивается обычной коман­дой возврата; она заканчивается командой IRET, которая извлекает из стека флажки. Поэтому для правильной работы флажки должны быть в стеке. Для этого перед командой косвенного межсегментного вызова можно поставить команду включения в стек флажков PUSHF, но такой прием становится громоздким. Было бы хорошо иметь одну команду, которая выполняет все, что делает процессор при распознавании прерыва­ния, но с одним исключением - тип прерывания содержится в команде, а не выдается внешним устройством. Такой командой и является команда прерывания

Соседние файлы в папке Лекции препода