Директиви підпрограм в turbo pascal 7

10.5. директиви підпрограм

Директиви дають додаткову інформацію транслятор про розміщенні підпрограм.

10.5.1. Директива FORWARD

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

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

Приклад. Процедура First викликає процедуру Second, а та, в свою чергу, процедуру First.

procedure First (A, В: Integer); forward;

Директиву forward можна використовувати і просто для більш зручного розміщення підпрограм: спочатку описати все заголовки, а потім - самі підпрограми. Цю директиву не слід використовувати в модулях (див. П. 16) для підпрограм, оголошених в інтерфейсі модуля.

10.5.2. Директиви FAR і NEAR

10.5.3. Директива EXTERNAL

Директива external дозволяє використовувати в програмі підпрограми, написані на мові асемблера і скомпільовані окремо. Ці підпрограми повинні бути скомпоновані з основною програмою, використовуючи ключ. Тут ім'я файлу - ім'я того файлу (з розширенням .OBJ), в якому знаходяться скомпільовані об'єктні модулі підпрограм, написаних на мові асемблера.

function Max (X, Y: Real): Real; external;
procedure Search (var Mas; N: Integer;
var Max, Min: Integer); external;

Директиву external слід використовувати, якщо підпрограми на асемблері мають великий розмір і їх краще скомпілювати окремо, а не використовувати вбудований асемблер або писати їх в кодах процесора, використовуючи директиву inline (див. П. 10.5.5).

10.5.4. Директива ASSEMBLER

Директива assembler дозволяє написати підпрограму повністю на мові асемблера. При цьому під час компіляції підпрограма буде автоматично скомпільована вбудованим асемблером пакету Turbo Pascal. При налагодженні такої підпрограми можна використовувати вбудований відладчик пакета.

Приклад. Функція, що визначає максимальне з двох чисел.

function MaxTwo (X, Y: Integer): Integer; assembler;
asm
MOV AX. X
CMP AX. Y
JG @ 1
MOV AX. Y
@ 1:
end;

10.5.5. Директива INLINE

Директива дозволяє включити в текст програми команди, записані безпосередньо в машинних кодах. На відміну від інших підпрограм підпрограма з директивою inline безпосередньо додається всюди, де є її виклик (фактично вона є Макроозначення). Такі підпрограми можуть мати па параметри, які можна використовувати в тексті підпрограми, отримуючи їх з стека.

Машинні коди в процедурі записуються в круглих дужках побайтно через прямий слеш (/).

Приклад. Функція, що обчислює максимальне з двох чисел.

10.5.6. Директива INTERRUPT

Директива interrupt призначена для процедур, що обробляють переривання. Такі процедури мають стандартний заголовок:

procedure IntHandler (Flags, CS, IP, AX,
BX, CX, DX, SI, DI, DS, ES, BP: Word); interrupt;
begin
.
end;

У заголовку окремі параметри можна опускати (але тільки з початку списку), проміжні параметри видаляти не можна, наприклад:

procedure IntHandler (DI, ES, BP: Word); interrupt;

procedure IntHandler (DI, DS, ES, BP: Word); interrupt;

Не можна в заголовку процедури обробки переривань записувати і будь-які інші параметри.