Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТСвИС / (х) учебное пособие. организация Компьютеров и Систем.doc
Скачиваний:
83
Добавлен:
28.05.2015
Размер:
1.15 Mб
Скачать

2.15 Система прерываний вм86.

В МП ВМ86 каждому источнику запроса на прерывание ставится в соответствие так называемый тип (номер) прерывания. Тип имеет формат 1 байт. То есть всего возможно 256 различных источников запросов. Для того чтобы МП по известному типу мог определить начальный адрес обработчика, в ОП создается таблица векторов прерываний. Каждый вектор представляет собой пару сегмент:смещение и однозначно задает начальный адрес обработчика прерывания данного типа. В ОП вектор занимает 4 байта. Таблица прерываний ВМ86 всегда располагается в младшем Кбайте ОП. Ее формат приведен на рис. 19.

Здесь displ и disph – соответственно младший и старший байт смещения, а segl и segh – младший и старший байт сегмента. Из рис.20 видно, что для определения адреса вектора достаточно взять тип и умножить его на 4. Именно так и вычисляет адрес вектора МП.

При восприятии любого прерывания ВМ86 выполняет следующую последовательность действий:

  • запоминает в стеке содержимое регистра флагов f и адрес возврата (содержимое регистров cs и ip);

  • по известному типу находит в таблице соответствующий вектор и загружает disp в ip, а seg – в cs, тем самым, передавая управление обработчику.

Рис. 19

Этот процесс можно формально описать следующим образом:

sp ← (sp)-2

Аф = (ss)×16 + (sp)

Аф ← (f)

sp ← (sp)-2

Аф = (ss)×16 + (sp)

Аф ← (cs)

sp ← (sp)-2

Аф = (ss)×16 + (sp)

Аф ← (ip)

Аф = тип × 4

ip ← (Аф)

Аф = тип × 4 + 2

cs ← (Аф)

Так как таблица прерываний располагается по младшим адресам ОП, никакие сегментные регистры в формировании адреса вектора участия не принимают.

Помимо рассмотренных выше двух пунктов, МП также сбрасывает в ноль флаги if и tf, маскируя внешние прерывания и запрещая пошаговое выполнение обработчика.

Источники запросов для ВМ86 показаны в таблице 5.

Таблица 5

Источник запроса (вид прерывания)

Тип

Приоритет

Прерывание по ошибке деления

0

1

Прерывание по флагу tf

1

4

Прерывание по входу NMI

2

2

Прерывание по команде int3

3

1

Прерывание по команде into

4

1

Программные прерывания (по команде int n, где n = 0 – 255)

0 - 255

1

Прерывания по входу INTR

0 - 255

3

Здесь 1 – старший приоритет, 4 – младший.

Далее рассмотрим кратко имеющиеся виды прерываний.

Прерывание по ошибке деления (divided overflow). Это прерывание возникает при выполнении команд деления div и idiv, если формат результата (частного) превышает формат регистра-приемника. То есть, с точки зрения МП, результат деления равен бесконечности. В частности такая ситуация возникает при попытке деления на ноль.

Прерывание по флагу tf. Это прерывание возникает после выполнения любой очередной команды программы, если флаг tf установлен в единицу. При переходе к обработчику МП сбрасывает tf в ноль, поэтому обработчик выполняется не в пошаговом, а в автоматическом режиме. При возврате из обработчика по команде iret МП восстанавливает (выталкивает из стека) старое содержимое регистра флагов f. Флаг tf при этом снова устанавливается в единицу и МП возвращается в пошаговый режим. Обработчик этого прерывания обычно выводит на экран содержимое внутренних регистров МП.

Прерывание по команде int3. Это однобайтовая команда «прерывание в контрольной точке». Используется при отладке программы. Располагаются эти команды в критических местах программы (например, их туда может вставлять debugger). Обработчик этого прерывания также обычно выводит на экран содержимое регистров МП.

Прерывание по команде into. Команда проверяет состояние флага переполнения of, и если он установлен в единицу происходит прерывание.

Прерывание по команде int n. Это двухбайтная команда, в которой n задает тип прерывания и может принимать значение от 0 до 255. Таким образом с помощью такой команды мы можем вызвать любой обработчик. Собственно говоря, команда int n представляет из себя команду межсегментного вызова подпрограммы и в этом смысле подобна команде call far. Разница между этими командами в том, что int n занимает в памяти два байта, а call far – пять, int n сохраняет в стеке содержимое регистра флагов f, а call far не сохраняет. Команды int n используются для обращения к системным библиотечным подпрограммам (например, к средствам DOS и BIOS).

Прерывания по входам INTR и NMI были рассмотрены ранее.