- •Организация эвм и систем
- •Глава 1 эвм общего назначения
- •Структура эвм общего назначения.
- •Арифметико-логические устройства.
- •Устройства управления.
- •Risc и cisc процессоры.
- •1.5 Форматы машинных команд.
- •Inc byte ptr [40h] – одноадресная
- •Способы адресации.
- •Стековая адресация. Виды стеков.
- •Глава 2
- •2.1 Микропроцессор к1810вм86.
- •2.2 Назначение входов/выходов вм86 в минимальном режиме.
- •2.3 Назначение входов/выходов вм86 в максимальном режиме.
- •Внутренняя архитектура мп вм86.
- •Сегментация памяти.
- •2.6 Программная модель мп вм86.
- •2.7 Организация оперативной памяти.
- •2.8 Организация адресного пространства портов ву.
- •2.9 Методы обмена информацией между мп и портами ву.
- •2.10 Параллельный программируемый адаптер к1810вв55 (i8255).
- •Пример использования и программирования адаптера
- •2.12 Программируемый таймер к1810ви54 (i8254).
- •2.13 Пример использования таймера.
- •2.14 Обработка прерываний.
- •2.15 Система прерываний вм86.
- •2.16 Контроллер прерываний к1810вн59 (i8259).
- •Дополнительная информация о настройке вн59.
- •Прямой доступ к памяти.
- •Программирование кпдп вт37
- •2.21 Организация процессорного модуля вм86.
- •2.20. Организация шинного интерфейса в максимальном режиме
- •2.23. Слабо связанные конфигурации.
- •2.24. Арбитр шин к1810вб89 (i8289).
- •2.25 Сильно связанные конфигурации на примере совместной работы мп86 и арифметического сопроцессора вм87.
- •2.26. Формат машинной команды вм86.
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 были рассмотрены ранее.