Обработка прерывания в реальном режиме

производится в три этапа:

1) прекращение выполнения текущей программы;

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

Обязательными для сохранения являются регистры cs, ip, flags (пара CS:IP содержит адрес команды, с которой необходимо начать выполнение после возврата, flags - состояние флагов после выполнения последней команды прерванной программы).

!!! Эти регистры сохраняются микропроцессором автоматически. Сохранение остальных регистров - должно обеспечиваться программистом!!!

Наиболее удобным местом хранения регистров является стек.

После сохранения регистров в стеке микропроцессор сбрасывает бит флага IF (т.е.=0) (!!! В стеке при этом записан регистр flags с еще установленным IF!!!) Этим предотвращается возможность возникновения вложенных внешних прерываний и порча регистров исходной программы вследствие неконтролируемых действий со стороны программы - обработчика вложенного прерывания. После того как необходимые действия по сохранению контекста завершены, обработчик аппаратного прерывания может разрешить вложенные прерывания командой sti.

2) переход к выполнению и выполнение программы обработки прерывания;

Здесь определяется источник прерывания и вызывается соответствующий обработчик прерывания.

Как уже отмечалось ранее, самое начало оперативной памяти от адреса 00000h до 003FFh (первые 1024 байт) отводится под векторы прерываний - 4-байтовые области, в которых хранятся адреса обработчиков прерываний. В два старших байта каждого вектора записывается сегментный адрес обработчика, в два младших - смещение точки входа в обработчик. Векторы, как и соответствующие им прерывания, имеют номера, причем вектор с номером 0 располагается начиная с адреса 0, вектор 1 - с адреса 4, вектор 2-е адреса 8 и т. д. Вектор с номером n занимает, таким образом, байты памяти от n *4 до n *4+3. Всего в выделенной под векторы области памяти помещается 256 векторов.

Например, прерывание 21h занимает в этой таблице 33 место (21h – это 33 в десятичной системе счисления). Зная номер прерывания, процессор просто умножает его на 4, затем обращается к таблице и получает там адрес перехода.

Увидеть этот адрес можно и вручную, если правильно настроить один из сегментных регистров. Например, адрес перехода для прерывания 21h можно получить так:

mov ax, 0mov es, ax; es =0mov bx, 21h; номер прерыванияshl bx, 2; умножим на 4mov ax, es:[bx];смещениеmov dx, es:[bx+2];сегмент

Итак на втором этапе микропроцессор

1. По номеру источника прерывания определяет смещение в таблице векторов прерываний

2. Помещает первые два байта в регистр IP

3. Помещает вторые два байта в регистр CS

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

Далее выполняется сама программа обработки прерывания.

(Она тоже может быть прервана поступлением запроса от более приоритетного источника. Все источники прерывания имеют приоритеты.)

3) возврат управления прерванной программе.

Необходимо привести стек в состояние, в котором он был сразу после передачи управления данной процедуре. Для этого программист должен указать необходимые действия по восстановлению регистров и очистке стека.!! Этот участок необходимо защитить от возможного искажения содержимого регистров (в результате появления аппаратного прерывания) с помощью команды cli.

Последние команды в в обработчике прерывания - sti, iret (interrupt return)

sti - разрешить аппаратные прерывания (устанавливает флаг IF=1, не имеет операндов).

iret - извлечь последовательно три слова из стека и поместить их соответственно в регистры ip, cs, flags.

В действительности запросы на обработку прерываний могут иметь различную природу. Помимо описанных выше аппаратных прерывания от периферийных устройств, называемых часто внешними, имеются еще два типа прерываний: внутренние и программные.

Внутренние прерывания возбуждаются цепями самого процессора при возникновении одной из специально оговоренных ситуаций, например при выполнении операции деления на нуль или при попытке выполнить несуществующую команду. За каждым из таких прерываний закреплен определенный вектор, номер которого известен процессору. Например, за делением на.0 закреплен вектор 0, а за неправильной командой - вектор 6. Если процессор сталкивается с одной из таких ситуаций, он выполняет описанную выше процедуру прерывания, используя закрепленный за этой ситуацией вектор прерывания.

Чрезвычайно важным типом прерываний являются программные прерывания. Они вызываются командой int с числовым аргументом, который рассматривается процессором как номер вектора прерывания. Если в программе встречается, например, команда

int 13h

то процессор выполняет ту же процедуру прерывания, используя в качестве номера вектора операнд команды int. Программные прерывания применяются в первую очередь для вызова системных обслуживающих программ - функций DOS и BIOS. С командой int 21h вызова DOS мы уже сталкивались ранее и будем встречаться еще многократно. В дальнейшем будут также приведены примеры использования команды int для вызова прикладных обработчиков программных прерываний.

Важно подчеркнуть, что описанные действия процессора выполняются совершенно одинаково для всех видов прерываний - внутренних, аппаратных и программных, хотя причины, возбуждающие процедуру прерывания, имеют принципиально разную природу.

Всего, как уже было сказано, в памяти отводится место под 256 векторов прерываний. Некоторые из них практически не используются; к другим, наоборот, приходится обращаться едва ли не в каждой программе.

Как видно из приведенной таблицы, векторы прерываний можно разбить на

следующие группы:

• векторы внутренних прерываний процессора (Olh, 02h и др.);

• векторы аппаратных прерываний @8h...0Fh и 70h...77h);

• программы BIOS обслуживания аппаратуры компьютера A0h, 13h, 16h и др.);

• программы DOS B1h, 22h, 23h и др.);

• адреса системных таблиц BIOS (lDh, lEh и др.).

Системные программы, адреса которых хранятся в векторах прерываний, в большинстве своем являются всего лишь диспетчерами, открывающими доступ к большим группам программ, реализующих системные функции. Так, программа BIOS обслуживания видеосистемы (вектор 10h) включает функции смены видеорежима, управления курсором, задания цветовой палитры, загрузки шрифтов и многие другие. Особенно характерен в этом отношении вектор 21h, через который, как мы уже знаем, осуществляется вызов практически всех функций DOS, используемых в прикладных программах: ввода с клавиатуры и вывода на экран, обслуживания файлов, каталогов и дисков, управления памятью и процессами, службы времени и т. д. Однако ряд функций DOS реализуются через другие векторы. Так, для прямого доступа к гибким и жестким дискам (не по имени файла, а по номеру сектора на диске) предусмотрены специальные программные векторы 25h и 26h, а обработка введенной с клавиатуры команды Ctrl+C выполняется с помощью вектора 23h.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: