[ Тематический план ] [ Система прерываний ] [ 1 ] [ 2 ]
Таблица указателей векторов прерываний осуществляет связь между кодом типа прерывания и процедурой, которая обслуживает прерывание данного типа. Таблица занимает 1 Кбайт памяти с диапазоном адресов 0 - 3FF и может содержать до 256 элементов. Каждый элемент i таблицы представляет собой полный начальный логический адрес процедуры, которая обслуживает прерывание типа i. Слово с меньшим адресом содержит смещение, а слово с большим адресом - базовый адрес сегмента. Так как каждый элемент таблицы состоит из 4 байт, процессор вычисляет адрес нужного элемента таблицы путем умножения кода типа на 4.
Когда вызывается процедура прерывания, содержимое регистров флагов, CS и IP включено в стек, а флаги IF и TF сброшены. Процедура может разрешить внешние прерывания командой STI, допуская прерывание самой себя запросом на входе INT. Кроме того, она может быть всегда прервана запросом на входе немаскируемых прерываний на входе NMI. Внутренние прерывания, возникающие при выполнении процедуры, будут также прерывать ее. В каждой процедуре необходимо тщательно следить за тем, чтобы в ней не возникло прерывание того типа, которое она обслуживает. Необходимо также задавать объем стека, рассчитанный на максимальную глубину вложения прерываний.
Каждая процедура прерывания должна запоминать в стеке содержимое всех регистров, которые она использует, до их модификации, а перед завершением восстанавливать содержимое этих регистров.
Целесообразно разрешать восприятие прерываний по входу INT для всех частей процедуры, за исключением критических секций, которые нельзя прерывать без риска получения ошибочных результатов. Если прерывания запрещены слишком долго, возникает потенциальная опасность потери запросов прерываний по входу INT.
Процедура прерывания должна заканчиваться командой возврата из прерывания IRET. Перед ее выполнением предполагается, что стек находится в том состоянии, в каком он был сразу после вызова процедуры. Команда IRET извлекает три верхних слова из стека в регистры IP, CS и флагов.
Фактические действия процедуры зависят от ее назначения. Если процедура обслуживает периферийное устройство, она должна передать ему приказ о снятии запроса прерывания. Затем она может получить от устройства информацию о его состоянии, определить причину прерывания и предпринять соответствующие действия.
Программные прерывания можно использовать для вызова обслуживающих программ операционной системы (вызов супервизора).
Займемся теперь содержимым таблицы векторов прерываний. Приведем назначение некоторых наиболее важных векторов:
| Номер | Описание |
| 0 | Ошибка деления. Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0). DOS обычно при обработке этого прерывания выводит сообщение об ошибке и останавливает выполнение программы. Для процессора 8086 при этом адрес возврата указывает на следующую после команды деления команду, а в процессоре 80286 - на первый байт команды, вызвавшей прерывание. |
| 1 | Прерывание пошагового режима. Вырабатывается после выполнения каждой машинной команды, если в слове флагов установлен бит пошаговой трассировки TF. Используется для отладки программ. Это прерывание не вырабатывается после выполнения команды MOV в сегментные регистры или после загрузки сегментных регистров командой POP. |
| 2 | Аппаратное немаскируемое прерывание. Это прерывание может использоваться по-разному в разных машинах. Обычно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора. |
| 3 | Прерывание для трассировки. Это прерывание генерируется при выполнении однобайтовой машинной команды с кодом CCh и обычно используется отладчиками для установки точки прерывания. |
| 4 | Переполнение. Генерируется машинной командой INTO, если установлен флаг OF. Если флаг не установлен, то команда INTO выполняется как NOP. Это прерывание используется для обработки ошибок при выполнении арифметических операций. |
| 5 | Печать копии экрана. Генерируется при нажатии на клавиатуре клавиши PrtScr. Обычно используется для печати образа экрана. Для процессора 80286 генерируется при выполнении машинной команды BOUND, если проверяемое значение вышло за пределы заданного диапазона. |
| 6 | Неопределенный код операции или длина команды больше 10 байт (для процессора 80286). |
| 7 | Особый случай отсутствия математического сопроцессора (процессор 80286). |
| 8 | IRQ0 - прерывание интервального таймера, возникает 18,2 раза в секунду. |
| 9 | IRQ1 - прерывание от клавиатуры. Генерируется при нажатии и при отжатии клавиши. Используется для чтения данных от клавиатуры. |
| A | IRQ2 - используется для каскадирования аппаратных прерываний в машинах класса AT. |
| B | IRQ3 - прерывание асинхронного порта COM2. |
| C | IRQ4 - прерывание асинхронного порта COM1. |
| D | IRQ5 - прерывание от контроллера жесткого диска для XT. |
| E | IRQ6 - прерывание генерируется контроллером флоппи-диска после завершения операции. |
| F | IRQ7 - прерывание принтера. Генерируется принтером, когда он готов к выполнению очередной операции. Многие адаптеры принтера не используют это прерывание. |
| 10 | Обслуживание видеоадаптера. |
| 11 | Определение конфигурации устройств в системе. |
| 12 | Определение размера оперативной памяти в системе. |
| 13 | Обслуживание дисковой системы. |
| 14 | Последовательный ввод/вывод. |
| 15 | Расширенный сервис для AT-компьютеров. |
| 16 | Обслуживание клавиатуры. |
| 17 | Обслуживание принтера. |
| 18 | Запуск BASIC в ПЗУ, если он есть. |
| 19 | Загрузка операционной системы. |
| 1A | Обслуживание часов. |
| 1B | Обработчик прерывания Ctrl-Break. |
| 1C | Прерывание возникает 18.2 раза в секунду, вызывается программно обработчиком прерывания таймера. |
| 1D | Адрес видеотаблицы для контроллера видеоадаптера 6845. |
| 1E | Указатель на таблицу параметров дискеты. |
| 1F | Указатель на графическую таблицу для символов с кодами ASCII 128-255. |
| 20-5F | Используется DOS или зарезервировано для DOS. |
| 60-67 | Прерывания, зарезервированные для пользователя. |
| 68-6F | Не используются. |
| 70 | IRQ8 - прерывание от часов реального времени. |
| 71 | IRQ9 - прерывание от контроллера EGA. |
| 72 | IRQ10 - зарезервировано. |
| 73 | IRQ11 - зарезервировано. |
| 74 | IRQ12 - зарезервировано. |
| 75 | IRQ13 - прерывание от математического сопроцессора. |
| 76 | IRQ14 - прерывание от контроллера жесткого диска. |
| 77 | IRQ15 - зарезервировано. |
| 78 - 7F | Не используются. |
| 80-85 | Зарезервированы для BASIC. |
| 86-F0 | Используются интерпретатором BASIC. |
| F1-FF | Не используются. |