Прерываемая программа
Запрос на прерывание
t1 t2
Ядро ОС
t3 t5
Программа обработки
t4
Рис. 2. Временная диаграмма обработки прерывания:
t2 – t1 = tp – время реакции; t3 – t2 = tз – время запуска программы обработки прерываний; t4 – t3 = tоп – время работы программы обработки прерываний; t5 – t4 = tв – время возобновления прерванной программы; tв + tз = tp – время накладных расходов
Прерывания IBM PC
Существуют прерывания BIOS (0 – 1F)и прерывания DOS (20 – FF). 1. Аппаратные прерывания от внешних устройств:
-отказ питания;
-таймер;
-клавиатура;
-адаптер связи;
-накопитель на гибких магнитных дисках (НГМД); и т.д.
2. Исключения (логические прерывания от микропроцессора): 1 – пошаговый режим; 3 – достижение контрольной точки в процессе трассировки программы; 4 – переполнение.
3. Программные прерывания.
Схема движения информации при обработке прерываний
В IBM PC память делится на сегменты. Максимальный объем сегмента равен в ОС MS-DOS – 64 Кбайт. Адрес команды хранится в двух регистрах процессора: CS – начальный адрес сегмента кода; IP – смещение относительно начала сегмента. Реальный физический адрес команды в оперативной памяти вычисляется как сумма CS + IP. При поступлении сигнала прерывания ПК выполняет следующие действия.
11
а) завершение текущей команды; б) сохранение адреса следующей команды в стеке;
в) обращение к таблице векторов прерываний; г) получение в таблице адреса программы обработки прерываний;
д) выполнение программы обработки прерываний; е) обращение к стеку за адресом прерванной программы (при до-
стижении команды IRET);
ж) запись этого адреса из стека в соответствующие регистры CS, IP; з) возвращение к выполнению прерванной программы.
Такая организация позволяет иметь разные программы для обработки одного и того же типа прерывания.
Структура данных при обработке прерываний в программе, написанной на PASCAL
Для обращения к содержимому регистров необходимо использовать структуру данных (запись), описанную в модуле DOS Turbo-Pascal:
type
Registers = record case integer of
0:(AX, BX, CX, DX, BP, SI, DS, DI, ES, Flags: Word);
1:(AL, AH, BL, BH, CH, DL, DH, CL:Byte);
end;
Модули DOS:
Intr (IntNo: Byte; var Regs: Registers) – выполняет прерывания с за-
данным номером IntNo;
MsDOS (var Regs: Registers);
SetIntVec (IntNo: Byte; Vector: Pointer) – адрес процедуры обработки прерывания;
GetInVec (IntNo: Byte; var Vector: Pointer) – получение и запись ад-
реса из таблицы векторов.
Процедура для обработки прерывания должна иметь вид:
Procedure <имя> (Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP: Word); interrupt;
Программа обработки прерывания Ctrl-Break
Program EX uses crt, dos;
var SaveAddrInt: Pointer; i: Integer;
{========================================}
12
{$F+} – указание на наличие межсегментных связей procedure Int1B: interrupt;
Begin end;
{$F-} {=========================================} Begin
GetIntVec ($1B, SaveAddrInt); (сохранение адреса старого обра-
ботчика)
For I:= 1 to 10 do delay (1000);
SetIntVec ($1B, SaveAddrInt); End.
Пример программы перехвата прерывания от таймера program init1C;
uses dos,Crt; var
Save_1C: pointer; c: char;
{=======================================} procedure pp1;interrupt;
const k:word = 0; begin
k:=k+1; k:=k mod 4; gotoxy(54,2); case k of
0:Write('/');
1:Write('-');
2:Write('\');
3:Write('|');
end;
end;
{======================================} begin
GetIntVec($1C,Save_1C); clrscr;
13
Writeln('Press any key to continiue...'); Writeln('Process is on....'); SetIntVec($1C,@pp1);
c:=readkey; SetIntVec($1C,Save_1C); end.
Пример перехвата прерывания от клавиатуры program sk;
uses crt,dos; var
savekbint:procedure;
f:string;
{======================================} procedure beep;
begin sound(1000); delay(100); nosound; end;
{=======================================} procedure new_in;interrupt;
const sign:boolean=true; begin
asm sti end;
if sign then beep; sign:=not sign; inline($9C); savekbint;
asm cli; end; end;
{=======================================}
14
begin Writeln('Ready!');beep;write(':'); GetIntVec($9,@savekbint); SetIntVec($9,addr(new_in)); readln(f); SetIntVec($9,@savekbint); end.
Общее задание
1.Используя пример программного прерывания, вывести заданное количество заданных символов в заданной позиции экрана в режиме 80 символов на строку восстановить режим и снова вывести строку, (установка режима – функция 00Н прерывания 10Н, режим 80 колонок – 3, 40 колонок – 1, описание функции: в AL – номер режима).
2.Используя прерывание таймера, написать собственный обработчик прерывания, который выводит на экран чередование букв Вашей фамилии (можно латинскими буквами).
Варианты индивидуальных заданий
Написать программу, выполняющую указанные действия с заданным устройством (системой), используя указанные прерывания, возможные для обработки (номер главы дан по [6]).
1.Клавиатура – 09h, 16h (гл. 3):
а) управление клавиатурой; б) доступ к отдельным клавишам; в) сводка скэн-кодов клавиш.
2.Диски – 13h (гл. 5):
а) управление распределением диска; б) работа с каталогами; в) подготовка к работе с файлами; г) чтение и запись файла;
д) подсчитать количество обращений к дисковым накопителям, используя прерывание.
3. Таймеры 1Аh,15h (гл. 2):
а) установка и чтение таймера; б) создание звука;
в) провести эксперимент с прерыванием таймера:
15