Обработка прерываний

Обработка прерываний в реальном режиме производится в 3 этапа:

  1. Прекращается выполнение текущей программы.
  2. Выполняется переход к выполнению и само выполнение программы обработки прерываний.
  3. Возврат управления прерванной программе.

1-ый этап должен обеспечить временное прекращение выполнения текущей программы, при этом должна сохраниться возможность продолжения работы программы после возникновения прерывания. Для этого необходимо учесть состояние разделяемых между программами ресурсов, т.е. регистров МП. Их содержимое необходимо сохранять. Регистры CS, IP, eFlags сохраняются МП автоматически. Сохранение содержимого остальных регистров должно обеспечиваться программистом - в начале программы обработки прерывания до их использования. Наиболее удобным местом хранения регистров является стек. В конце первого этапа МП после включения в стек регистров FLAGS, CS и IP сбрасывает бит флага прерываний, при этом в стек записывается предыдущее значение регистра FLAGS.

2-ой этап заключается в определении источника прерывания и вызова соответствующей команды обработки. В реальном режиме работы МП допускается до 255 источников прерывания. Количество источников ограничивается размером таблицы векторов прерываний. Эта таблица – связующее звено между источником прерывания и процедурой обработки. На 2-ом этапе обработки прерываний МП выполняет следующие действия:

· По номеру источника прерывания определяет смещение в таблице векторов прерываний = n*4, где n от 0 до 255 и соответствует номеру источника прерываний, а 4 – это каждый элемент таблицы векторов прерываний занимает 4 байта, причем первое слово элемента таблицы содержит адрес начала процедуры обработки прерывания относительно начала кодового сегмента. Второе слово элемента таблицы содержит базовый адрес кодового сегмента, в котором находится процедура обработки прерывания.

· Размещаем первые 2 байта в регистр IP.

· Вторые 2 байта по вычисленному адресу в регистр CS.

· Передается управление по адресу CS:IP.

3-ий этап – восстановления контекста прерванной программы. Т.е приведение стека в состояние, в котором он был сразу до возникновения прерывания. Для этого программист должен выполнить действия по восстановлению регистров и очистке стека. Результатом 3-го этапа является передача управления очередной команде прерванной программы, которая должна была выполниться, если прерывания не было.