Прерывание (англ. interrupt) – сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей программы приостанавливается, и управление передается обработчику прерывания, который реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код.
Различают асинхронные или внешние, или аппаратные прерывания (прерывания, появление которых никак не связано с исполняемой в данный момент программой) и синхронные или программные прерывания, вызываемые из программы исполнением специальной инструкции. Программные прерывания имитируют действие аппаратных прерываний.
Каждому событию (прерыванию) соответствует своя специальная процедура для его обработки (обработчик прерываний). Она может размещаться в постоянном запоминающем устройстве (входить в состав BIOS (от англ. Basic Input/Output System — «базовая система ввода-вывода»)), и в ядре операционной системы (MS-DOS). Поэтому принято говорить о прерываниях BIOS и прерываниях MS-DOS. Каждая процедура обработки прерывания имеет свой адрес (адрес начала этой процедуры) записанный в формате «сегмент:смещение» (адрес занимает 32 бита, то есть четыре ячейки памяти). Эти адреса при загрузке компьютера загружаются в ячейки ОЗУ, размещенные в ее начальных адресах (начиная с физического адреса 00000H). Причем эта загрузка всегда однозначна – адрес начала процедуры обработки определенного прерывания всегда размещается в строго определенных четырех ячейках памяти. Также каждое прерывание (и каждая процедура обработки прерывания) имеет свой номер (вектор). Именно по этому номеру происходит вызов процедуры обработки прерывания из программы. Между номером прерывания и физическим адресом ячейки памяти, в которой размещается адрес процедуры обработки прерывания, есть однозначная связь:
.
Принято говорить, что при загрузке компьютера в начальных адресах памяти загружается однозначная таблица векторов прерываний, устанавливающая связь между номером (вектором) прерывания и процедурой его обработки. Допустимое количество прерываний равно 256 (номера от 0 до 255 или от 00H до FFH), и так как на каждый номер требуется четыре ячейки памяти, то таблица векторов прерываний занимает 1024 байта = 1 Кбайт.
Вызов определенной процедуры обработки прерывания осуществляется командой INT (от англ. INTerrupt – прервать) формат которой показан на рис.12.1. Схема вызова обработчика прерывания показана на рис.12.2.
Рис. 12.1. Формат команды INT
Рис. 12.2. Вызов обработчика прерываний
Вызов обработчика прерывания представляет собой, по сути, вызов процедуры дальнего типа. После выполнения команды INT в стек записывается флаговый регистр и адрес возврата (сначала сегментный регистр СS, а потом регистр указатель команд IP), а также сбрасываются флаги TF и IF для запрещения пошагового выполнения и маскируемых прерываний. Затем вычисляется адрес вектора прерываний (по его номеру), и первое слово этого вектора помещается в регистр IP, а второе в регистр CS и начинается выполнение процедуры обработки прерывания.
Процедура обработки прерывания обычно заканчивается командой возврата из прерывания IRET, выполняющей обратные действия – загрузку IP, CS и регистра флагов из стека, что приводит к возврату в основную программу в точку, где она была прервана (на команду, следующую за командой INT).
Для выполнения своих действий процедура обработки прерываний требует определенных входных параметров, которые заносятся в соответствующие регистры перед выполнением команды INT. В частности у каждого прерывания есть еще набор функций, определяющий тот или иной режим работы процедуры обработки прерывания. Номер функции (не номер вектора) перед выполнением команды INT заносится в регистр AH.
Пример вызова функции прерывания:
MOV AH,func;Номер функции
;Заполнение остальных необходимых регистров (AL, BX, ES, BP и др.)
;параметрами необходимыми для выполнения функции
INT XXH
Большинство прерываний MS-DOS и BIOS возвращают во флаге переноса CF код завершения. Если функция прерывания выполнилась успешно, то флаг CF = 0, в случае любой ошибки – флаг CF = 1. В случае ошибки в одном из регистров (обычно в АХ) возвращается еще и код ошибки.
Наиболее часто используемые прерывания:
– INT 10H – прерывание BIOS для работы с видеопамятью (управление позицией курсора, вывод текста на экран в цвете, прокрутка экрана);
– INT 16H – прерывание BIOS для работы с клавиатурой (набор процедур для чтения данных с клавиатуры и проверки ее состояния);
– INT 21H – прерывание MS-DOS (набор процедур для выполнения ввода-вывода, работы с файлами и памятью).