16.5. Работа с прерываниями MS-DOS
Вызов системных функций MS-DOS реализован в виде прерываний. Каждое прерывание, будучи активизированным, может открывать доступ к множеству различных функций. Так, например, прерывание с номером 16H дает доступ к функциям опроса клавиатуры на уровне операционной системы, прерывание с номером 25H управляет чтением диска и т.д. Особую роль играет прерывание с номером 21H. Оно открывает доступ к нескольким десяткам функций, образующим собственно операционную систему.
Работая на ассемблере, программист при необходимости вызова той или иной функции MS-DOS должен предварительно загрузить в определенные регистры процессора номер функции и ее аргументы и вызвать прерывание по его номеру. Список прерываний, связанных с ними функций и их аргументов, занял бы целую книгу и здесь не приводится. Заинтересованных мы отсылаем к техническим описаниям MS-DOS конкретных версий и БСВВ (BIOS) конкретных ПЭВМ.
А как быть тем, кто знает Паскаль, но не знаком с машинным кодом? Ответ прост: пользоваться процедурами модуля DOS, поддерживающими обращение к функциям MS-DOS (или прерываниям), прямо из Паскаль-программ (но знать, что делает прерывание и как выполняется, конечно, необходимо). Список этих процедур приводится в табл. 16.6.
Таблица 16.6
Процедура
Действие
GetIntVec(N : Byte; VAR Adress : Pointer)
Возвращает в Adress адрес подпрограммы прерывания с заданным номером N
SetIntVec(N : Byte; Adress : Pointer)
Устанавливает в DOS новую подпрограмму прерывания с номером N, замещая старое значение адреса на Adress
- 370 -
Intr(N : Byte; VAR R : registers)
Активизирует программное прерывание N, передавая ему номер функции и параметры в переменной R
MsDos(VAR R : Registers)
Специализированный вызов прерывания с номером 21H
В таблице введен новый тип Registers. Он определен в модуле DOS и является записью с вариантами:
| TYPE
Registers = RECORD
case Integer of
0: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags : Word);
1:(AL, AH, BL, BH, CL, CH, DL, DH : Byte);
| END;
Переменные такого типа служат для доступа к регистрам микропроцессора при вызовах Intr и MsDos. Вариант 0 позволяет обращаться к 16-разрядным регистрам (парам), а вариант 1 — к 8-разрядным ячейкам процессора. Специально об указании варианта заботиться не следует. Если написать, например,
USES DOS;
VAR
R1, R2 : Registers;
BEGIN
R1.AX := $01FF;
R2.AL := $CA;
…
END.
то компилятор сам разберется с типом поля записи по его имени.