Общая схема обработки запроса на прерывание следующая:
Реализуемая в момент появления запроса на прерывание машинная команда всегда выполняется до конца. Процессор считывает из контроллера прерывания номер прерывания. (При начальном программировании микросхемы контроллера обработки прерываний каждому входу запроса прерывания присваивается определенный номер). По считанному номеру осуществляется генерация соответствующей команды прерывания. По этой команде из области памяти, отведенной для адресов (векторов) подпрограмм, обслуживающих эти прерывания, выбирается соответствующий адрес и по нему происходит вызов подпрограммы.
Таким образом, векторы прерываний служат для идентификации процедур, необходимых для обслуживания требований прерывания.
Существует 256 векторов прерываний, поэтому каждому внешнему требованию на прерывание может быть поставлен в соответствие код прерывания в пределах 0 – 255. Таблица векторов прерываний занимает 1024 младших байта памяти (байты от 00000 до 003FFh) и имеет 256 входов в соответствии с количеством векторов.
Каждый вход таблицы является указателем двойного слова (4 байта), содержащего начальный адрес процедуры, которая обеспечивает обслуживание требования на прерывание данного типа. Можно считать, что вызов подпрограммы обработки прерываний аналогичен вызову одной из предопределенных подпрограмм всегда находящихся в одном месте. Старшее 16-битовое слово каждого входа таблицы содержит базовый адрес сегмента, в котором находится процедура. Младшее 16-битовое слово содержит смещение процедуры внутри сегмента. Т.к. каждый вход таблицы занимает 4 байта, адрес входа для прерывания данного типа (адрес младшего байта двойного слова) может быть определен умножением кода типа прерывания на 4.
старший адрес
-
003FFh
Указатель типа 255
…
…
00020h
Указатель типа 8 (таймер)
0001Ch
Указатель типа 7 (резерв)
00018h
Указатель типа 6 (резерв)
00014h
Указатель типа 5 (выдача на экран)
00010h
Указатель типа 4 (переполнение)
0000Ch
Указатель типа 3 (один байт содержит CCh)
00008h
Указатель типа 2 (немаскируемые прерывания по NMI)
00004h
Указатель типа 1 (пошаговый режим)
00000h
Указатель типа 0 (ошибка деления)
младший адрес
Внешние прерывания (маскируемые и немаскируемые).
В систему, на базе CPU i8086, может входить много соединенных с ним внешних устройств: матричная печать, дисплей, ЗУ на гибких дисках, клавиатура и другие. Ряд из них требует "внимания" со стороны CPU лишь на непродолжительный срок, остальное время они могут функционировать без помощи процессора.
Например, каждый раз, когда нажимается клавиша, устройство выдает в CPU требование на прерывание. Процессор приостанавливает свою работу и передает управление процедуре прерываний, обслуживающей клавишное устройство. Эта процедура содержит команды, необходимые для считывания и занесения символа в компьютерную память. Когда она завершается, CPU продолжает свою работу с того места программы, где его застало прерывание.
У CPU i8086 есть три линии прерываний RESET, NMI и INT, по которым внешние устройства могут передавать свои запросы на обслуживание со стороны процессора.
Запуск CPU i8086/88. При появлении запроса в линии RESET процессор выполняет следующие действия:
устанавливает флаг IF в нулевое состояние. Это приводит к невозможности выполнения маскируемых и пошаговых прерываний;
обнуляет регистры сегментов DS, ES и SS;
обнуляет регистр указатель инструкций IP;
засылает число FFFF в регистр сегмента команд CS.
CPU начинает работу с обращения к ячейке памяти с физическим адресом FFFF0. В ней содержится команда JMP, которая передает управление процедуре инициализации, запускающей компьютер.
Внешние требования, поступающие в процессор по линии INT, - это маскируемые прерывания. Если флаг прерывания IF=0 (прерывание невозможно), то требование маскируемого прерывания игнорируется и CPU продолжает выполнять очередную команду текущей программы. Если состояние флага IF=1 (прерывание разрешено), CPU подтверждает требование прерывания и передает управление той процедуре, которая должна обслужить поступившее требование. Для выполнения требования маскируемого прерывания CPU автоматически выполняет следующую последовательность действий:
генерируется сигнал подтверждения внешнего прерывания. Этот сигнал сообщает внешнему устройству о том, что его требование признано;
считывается код прерывания, поступивший на информационную шину с внешнего устройства;
содержимое регистра флагов копируется в ячейку памяти, адрес которой хранится в текущей вершине стека (SS : SP);
обнуляется флаг прерываний, что предотвращает возможность выполнения любого вновь поступающего маскируемого прерывания;
обнуляется флаг ловушки TF, что делает невозможным пошаговый режим;
в указатель инструкций IP засылается слово, находящееся по физическому адресу TYPE x 4, где TYPE – код типа прерывания;
в регистр сегмента кодов CS заносится слово, находящееся в ячейках памяти с физическим адресом (TYPE x 4) + 2.
После выполнения операций 6 и 7 управление передается процедуре обслуживания прерываний.
