
Обработка прерываний
Обработка прерываний в реальном режиме производится в 3 этапа:
Прекращается выполнение текущей программы.
Выполняется переход к выполнению и само выполнение программы обработки прерываний.
Возврат управления прерванной программе.
1-ый этап должен обеспечить временное прекращение выполнения текущей программы, при этом должна сохраниться возможность продолжения работы программы после возникновения прерывания. Для этого необходимо учесть состояние разделяемых между программами ресурсов, т.е. регистров МП. Их содержимое необходимо сохранять. Регистры CS, IP, eFlags сохраняются МП автоматически. Сохранение содержимого остальных регистров должно обеспечиваться программистом - в начале программы обработки прерывания до их использования. Наиболее удобным местом хранения регистров является стек. В конце первого этапа МП после включения в стек регистров FLAGS, CS и IP сбрасывает бит флага прерываний, при этом в стек записывается предыдущее значение регистра FLAGS.
2-ой этап заключается в определении источника прерывания и вызова соответствующей команды обработки. В реальном режиме работы МП допускается до 255 источников прерывания. Количество источников ограничивается размером таблицы векторов прерываний. Эта таблица – связующее звено между источником прерывания и процедурой обработки. На 2-ом этапе обработки прерываний МП выполняет следующие действия:
По номеру источника прерывания определяет смещение в таблице векторов прерываний = n*4, где n от 0 до 255 и соответствует номеру источника прерываний, а 4 – это каждый элемент таблицы векторов прерываний занимает 4 байта, причем первое слово элемента таблицы содержит адрес начала процедуры обработки прерывания относительно начала кодового сегмента. Второе слово элемента таблицы содержит базовый адрес кодового сегмента, в котором находится процедура обработки прерывания.
Размещаем первые 2 байта в регистр IP.
Вторые 2 байта по вычисленному адресу в регистр CS.
Передается управление по адресу CS:IP.
3-ий этап – восстановления контекста прерванной программы. Т.е приведение стека в состояние, в котором он был сразу до возникновения прерывания. Для этого программист должен выполнить действия по восстановлению регистров и очистке стека. Результатом 3-го этапа является передача управления очередной команде прерванной программы, которая должна была выполниться, если прерывания не было.
Использование прерываний в Паскале
Для обеспечения интерфейса с программами операционной системы используется модуль DOS. Для выполнения любого программного прерывания служит процедура
Intr (IntNo : byte; var reg : registers),
где IntNo – номер прерывания;
reg – переменная типа registers содержит значения регистров до и после входа в процедуру обработки заданного прерывания. Запись Registers представляет собой набор регистров процессора (поля записи).
Специальной разновидностью Intr является процедура MsDos(reg:registers), которая реализует доступ к функциям Dos-прерывания с номером 21h.
Таким образом, вызовы процедур MsDos(reg) и Intr($21, reg) при одинаковой установке значений переменной reg приводят к аналогичным результатам.
Основная последовательность действий при использовании этих функций:
поместить № функции в регистр ah;
поместить передаваемые функции параметры в определённые регистры;
вызвать прерывание командами intr (msdos);
извлечь результаты работы функции из определённых регистров.
Пример. Установить курсор в позицию (х,у) и вывести строку на экран, используя прерывания.
Uses crt,dos;
Const St:string='Hello$';
Var Reg:registers;
Begin
{установка курсора, используя 2-ую функцию Bios-прерывания $10}
With reg do
Begin
Ah:=2; {функция установки курсора}
Bx:=0; {номер видеостраницы}
Dl:=40; {номер столбца}
Dh:=12; {номер строки}
End;
Intr($10,reg); {установка курсора в позицию (12,40)}
{вывод строки, используя 9ую функцию Dos-прерывания $21}
With reg do
Begin
Ah:=9; {номер функции вывода строки на экран}
DS:=Dseg; {адрес текущего сегмента данных}
Dx:=ofs(st[1]); {смещение строки в сегменте данных}
End;
Msdos(reg);{вывод строки в текущую позицию экрана}
End.