Прерывания и исключения¶
Таблица векторов¶
| Вектор | Имя | Тип | Описание |
|---|---|---|---|
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-шина |
| ## Вычисление адреса обработчика |
Адрес обработчика вычисляется по формуле:
То есть каждый вектор занимает 4 байта в таблице.
Разница между INT и IRQ¶
| INT | IRQ | |
|---|---|---|
| Источник | Программа (INT imm8) |
Аппаратное устройство |
| Адрес возврата | IC + 2 |
IC + 0 |
| Момент | По команде программы | Асинхронно |
При программном прерывании INT адрес возврата - IC + 2, так как инструкция занимает 2 байта. При аппаратном прерывании IRQ - IC + 0, так как прерывание может произойти между любыми инструкциями.
Маскирование¶
Прерывания можно запрещать и разрешать командами процессора:
CLI- запретить прерывания.STI- разрешить прерывания.
Также есть регистр IRQ_MASK, который управляет маскированием отдельных источников.
Обработка прерывания¶
При возникновении прерывания:
- Текущее значение
IC(адрес возврата) сохраняется в стек. - Управление передаётся на адрес
IDTR + (vector << 2). - Обработчик выполняет свою работу.
- Команда
IRETвосстанавливаетICиз стека и возобновляет выполнение.