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.

то компилятор сам разберется с типом поля записи по его имени.