Перейти к содержанию

Прерывания и исключения

Таблица векторов

Вектор Имя Тип Описание
00h #DE Исключение Деление на ноль
01h #DB Исключение Отладка
02h #BP Исключение Точка останова
03h #OF Исключение Переполнение
04h #UO Исключение Неизвестный опкод
05h–1Fh - Reserved Зарезервировано
20h Timer IRQ Таймер
21h Disk IRQ Дисковый контроллер
22h GPU IRQ Видеокарта
23h Keyboard IRQ Клавиатура
24h Mouse IRQ Мышь
25h Audio IRQ Аудио (PSG)
26h Network IRQ Сеть
27h XPB-IRQ IRQ XPB-шина
## Вычисление адреса обработчика

Адрес обработчика вычисляется по формуле:

ISR_addr = IDTR + (vector << 2)

То есть каждый вектор занимает 4 байта в таблице.

Разница между INT и IRQ

INT IRQ
Источник Программа (INT imm8) Аппаратное устройство
Адрес возврата IC + 2 IC + 0
Момент По команде программы Асинхронно

При программном прерывании INT адрес возврата - IC + 2, так как инструкция занимает 2 байта. При аппаратном прерывании IRQ - IC + 0, так как прерывание может произойти между любыми инструкциями.

Маскирование

Прерывания можно запрещать и разрешать командами процессора:

  • CLI - запретить прерывания.
  • STI - разрешить прерывания.

Также есть регистр IRQ_MASK, который управляет маскированием отдельных источников.

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

При возникновении прерывания:

  1. Текущее значение IC (адрес возврата) сохраняется в стек.
  2. Управление передаётся на адрес IDTR + (vector << 2).
  3. Обработчик выполняет свою работу.
  4. Команда IRET восстанавливает IC из стека и возобновляет выполнение.