Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Паскал.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
1.21 Mб
Скачать

Переривання і системні виклики

Стандартні модулі системи Turbo Pascal містять дуже великий набір засобів для різних застосувань, що використовують більшість можливостей операційної системи MS-DOS. Проте в багатьох випадках виникає необхідність прямого звертання до MS-DOS як для одержання більшої ефективності програми, так і з метою використання деяких специфічних засобів операційної системи.

Для цих цілей у системному модулі Dos маються дві стандартні процедури. Перша процедура має ім'я Intr і дозволяє безпосередньо викликати програмні переривання, через які і реалізується доступ до всіх ресурсів операційної системи. Заголовок цієї процедури виглядає в так:

Intr ( IN : byte; var Regs: Registers )

Зміст параметрів наступний:

- IN - номер програмного переривання, яке необхідно викликати (0..255);

- Regs – запис за допомогою якого передаються параметри зазначеного переривання. Тип цього запису Registers визначається в модулі Dos так:

type

Registers = record

case integer of 0:(AX,BX,CX,DX,BP,SI,DI,DS,ES,

Flags:word);

l:(AL,AH,BL,BH,CL,CH,DL,DH:byte)

end;

Структура цього запису моделює набір регістрів центрального процесора (варіанти в цьому записі відбивають той факт, що з першими чотирма регістрами можна працювати або як з єдиними словами, або з їх старшими і молодшими частинами по окремості).

При виконанні процедури Intr значення полів AX, BX, СХ, DX, ВР, SI, DІ, DS і ЕS запису-параметра завантажуються в однойменні регістри ЦП. Після цього процедура реалізує виклик переривання з номером IN. Після того, як переривання буде виконане, новий уміст цих регістрів записується в запис Regs (цей запис передається в процедуру як параметр-змінна) у ті ж поля, а вміст регістрів прапорів розташовується в поле Flags. Таким чином, у програмі стають доступними результати виклику переривання.

Ця процедура не може використовуватися для виклику тих переривань, що вимагають завдання визначених значень регістрів SP чи SS чи змінюють значення цих регістрів. Для роботи з процедурою Intr потрібно детальне знання семантики, параметрів і результатів викликуваного переривання. Ці відомості містяться в технічних посібниках no операційній системі MS-DOS. Нижче приводиться простий приклад використання процедури Intr для визначення розмірів основної і розширений (extended) оперативної пам'яті ЕОМ. Параметрами процедури TotalMemory є змінні DosMemory і ExtMemory, у которі будуть поміщений розмір пам'яті, що адресується DOS, в одиницях по lК, і розмір розширеної оперативної пам'яті (з адресами, більшими 1 МБ). Процедура використовує переривання із шістнадцятьковими номерами $12 і $15, які, власне, і реалізують відповідні запити до операційної системи.

procedure TotalMemory(var DosMemory,ExtMemory :word);

var

Regs ; Registers;

begin

with Regs do

begin

Intr($12,Regs);

DosMemory:= АХ;{у полі АХ повертається розмір основної пам'яті};

AX:=$8800;{параметр виклику}

Intr{$15,Regs); ExtMemory:= АХ {у полі АХ повертається розмір розширеної пам'яті}

end

end;

Ця процедура може бути використана, наприклад, так:

uses

Dos ; var

DosM, ExtM: word;

procedure TotalMemory (varDosMsmory,ExtMamory : word);

begin

TotalMemory(DosM,ExtM);

Writeln('Ocновна пам'ять DOS = ',Dos,'K');

Writeln('Pозширена пам'ять = ',Ext,'K') end.

Друга процедура, використовувана для звертання до операційної системи, має ім'я MsDos і реалізує виклик конкретного переривання із шістнадцятьковим номером $21. Справа в тім, що дане переривання виконує велику кількість дій, об'єднаних під загальною назвою "функції MS-DOS". Тому для більш комфортабельного звертання до цих функцій доступ до переривання $21 виділений в окрему процедуру.

Єдиним параметром процедури MsDos є запис типу Registers.

MsDos ( var Regs : Registers )

Результат звертання до процедури MsDos буде той же самий, що і звертання до функції Intr з номером переривання $21.

Простий приклад використання процедури MsDos приведений нижче. Програма використовує функцію з номером 9 (цей номер передається через регістр АН) для виведення на екран тексту вітання. Через регістри DS і DX передається адреса першого байта виведеного рядка, що повинний завершуватися символом '$'.

program UseMsDos; uses

Dos; const

Msg : string = 'Привіт!$'; var

Regs : Registers; begin

with Regs do begin АН := 9; DS := Seg>(Msg), DX := Ofs(Msg[l]) end;

MsDos(Regs) end.