Материал: 2225

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Прерываемая программа

Запрос на прерывание

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

Источник: https://studfile.net/preview/16712649/