| OldlntVectN : Pointer; { буферная переменная }

| BEGIN

| N := { номер заменяемого прерывания };

| { Сохранение исходного вектора в буферной переменной:}

| GetIntVec( N, OldlntVectN );

| { Запись в вектор N адреса подставляемой процедуры: }

| SetIntVec( N, SMylnterrupt );

| ...

| { Программа работает с подмененным прерыванием: }

| Write( GlobalVARI, GlobalVAR2 GlobalVARK );

| ...

| SetIntVec( N, OldlntVectN );

| { Всегда надо восстанавливать исходные векторы, если }

| { только программа не остается резидентной в памяти. }

| END.

Рис. 16.12 (окончание)

Если потребуется модифицировать операционную систему, меняя вектора прерывания, то необходимо и желательно детально изучить техническое устройство механизма прерываний.

<p>16.5.2. Вызов прерывания процедурой Intr</p>

Процедура Intr(N : Byte; VAR R : Registers) выполняет прерывание номер N, передавая ему значение через регистры переменой R и в ней же возвращая сосояние регистров после обработки прерывания.

Пример использования процедуры Intr дан на рис 16.13.

<p>16.5.3. Процедура MsDos</p>

Процедура MsDos (VAR R: Registers) реализует частный случай вызова Intr( N, R ) для N = 33 (21Н). Эта процедура вызывает и выполняет одну из функций DOS прерывания с номером 21Н. Каждая функция имеет свой набор входных значений регистров в

- 374 -

| USES DOS;

| {Печать экрана на принтере, как при нажатии Shift+PrtScr}

| PROCEDURE PrintScreen;

| VAR R : Registers;

| BEGIN

| Intr( $05, R ) { вызов системного прерывания }

| END;

| BEGIN

| Write( 'Нажмите ENTER для запуска печати экрана ' );

| ReadLn;

| PrintScreen;

| END.

Рис. 16.13

записи R типа Registers. Обычно в R.AH должен содержаться номер функции, в R.AL и следующих — параметры для вызова. После выполнения процедуры MsDos регистр R.AL содержит, как правило, код завершения операции (0, если все в порядке) и возвращаемые величины в других регистрах. Пример использования MsDos — определение множества букв, обозначающих доступные в ПЭВМ диски (рис. 16.14). Для работы примера требуется MS-DOS версий 3.0 и старше.

| USES DOS; { АНАЛИЗ НАЛИЧИЯ ДИСКОВОДОВ В ПЭВМ }

| TYPE

| DrivesSetType = Set of 'A'..'Z'; { множество букв }

| { Процедура возвращает множество букв дисков в ПЭВМ }

| PROCEDURE TestDrives( VAR Drives : DrivesSetType );

| VAR

| R : Registers; { переменная-регистры }

| i : Byte; { параметр цикла }

| ch : Char; { буква очередного диска }

| BEGIN

| ch := Pred('A'); { символ перед 'A' }

| Drives := []; { стартовое значение набора }

| for i:=1 to 26 do begin { от диска A: до... }

| ch:=Succ( ch ); { буква рассматриваемого диска }

| R.AH := $44; { номер функции MS-DOS }

| R.AL := $08; { загрузка параметра в AL }

Рис. 16.14

- 375 -

| R.BL := i; { загрузка номера диска в BL }

| MsDos( R ); { вызов функции номер 44Н }

| if R.AX <= 1 { если АХ>1, то диска нет }

| then Drives := Drives + [ch]

| end {for}

| END;

| VAR { ПРИМЕР ВЫЗОВА }

| с : Char; { параметр цикла }

| HD : DrivesSetType; { множество дисков }

| BEGIN

| TestDrives( HD ); { анализ дисков }

| for c:='A' to 'Z' do

| if с in HD then WriteLn(c, ':' );

| ReadLn { пауза до нажатия клавиши ввода }

| END.

Рис. 16.14 (окончание)

<p>16.6. Организация субпроцессов и резидентных программ</p>
Перейти на страницу:

Поиск

Похожие книги