Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Описания assembler

Описания assembler позволяют вам написать всю процедуру или

функцию на ассемблере.

Примечание: Более подробно о процедурах и функциях на

Ассемблере рассказывается в Главе 24 "Встроенный ассемблер".

---------- ---- ----------- -------------

блок asm ->¦assembler+-->¦ ; +-->¦ раздел +-->¦asm оператор+->

L---------- L---- ¦ описания ¦ L-------------

L-----------

Описания inline

Директивы inline позволяют записывать вместо блока операто-

ров инструкции в машинном коде. При вызове обычной процедуры ком-

пилятор создает код, в котором параметры процедуры помещаются в

стек, а затем для вызова процедуры генерируется инструкция CАLL.

------------------

директива inline -->¦ оператор inline +---------->

L------------------

Когда вы вызываете подставляемую процедуру (inline), компи-

лятор генерирует код с помощью директивы inline, а не с помощью

инструкции CALL. Таким образом, поставляемая процедура "расширя-

ется" при каждом обращении к ней, аналогично макроинструкции на

языке ассемблера. Приведем два небольших примера подставляемых

процедур:

procedure DisableInterrupts: inline($FA); { CLI }

procedure EnableInterrupts; inline($FB); { STI }

Примечание: Синтаксические диаграммы оператора inline

описаны подробно в Главе 25.

Описания функций

Описание функции определяет часть программы, в которой вы-

числяются и возвращается значение.

---------- ---- -------- ----

описание --->¦заголовок+-->¦ ; +-->¦ тело +-->¦ ; +-->

функции ¦ функции ¦ L---- ¦функции¦ L----

L---------- L--------

--------- --------------

заголовок --->¦function+T>¦идентификатор+--T-------------------

функции L---------¦ L--------------^ ¦ ----------- ^ ¦

¦ --------------¦ ¦ ¦список ¦ ¦ ¦

L>¦ уточненный +- L->¦формальных+--- ¦

¦идентификатор¦ ¦параметров¦ ¦

¦ метода ¦ L----------- ¦

L-------------------------------------

¦ ---- ---------

L->¦ : +-->¦тип ре- +-->

L---- ¦зультата¦

L---------

--------------

тип результата --T-->¦идентификатор+--------->

¦ ¦ типа ¦ ^

¦ L-------------- ¦

¦ ------- ¦

L----->¦string+----------

L-------

Примечание: Функция не может возвращать процедурный

тип или структурный тип.

В заголовке функции определяется идентификатор функции, фор-

мальные параметры (если они имеются) и тип результата функции.

Функция активизируется при вызове функции. При вызове функ-

ции указывается идентификатор функции и какие-либо параметры, не-

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

в выражения в качестве операнда. Когда выражение вычисляется,

функция выполняется и значением операнда становится значение,

возвращаемое функцией.

В операторной части блока функции задаются операторы, кото-

рые должны выполняться при активизации функции. В модуле должен

содержаться по крайней мере один оператор присваивания, в котором

идентификатору функции присваивается значение. Результатом функ-

ции является последнее присвоенное значение. Если такой оператор

присваивания отсутствует или он не был выполнен, то значение,

возвращаемое функцией, не определено.

Если идентификатор функции используется при вызове функции

внутри модуля-функции, то функция выполняется рекурсивно.

Приведем далее примеры описаний функции:

function Max(a: Vector; n: integer): extended;

var

x: extended;

i: integer;

begin

x := a(1);

for i := 2 to n do if x < a[i] then x := a[i];

Max := x;

end;

function Power(x: extended; y: integer): extended;

var

z: extended;

i: integer;

begin

z := 1.0; i := y;

while i > 0 do

begin

if Odd(i) then z := z*x;

x := Sqr(x);

end;

Power := z;

end;

Аналогично процедурам функции могут описываться, как с ближ-

ним типом вызова (near), с дальним типом вызова (far), опережаю-

щие (forward), внешние (external), ассемблерные (assembler) или

подставляемые (inline). Однако функции прерываний (interrupt) не

допускаются.

Соседние файлы в предмете Программирование на Pascal