Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
выш.мат. методичка.DOC
Скачиваний:
30
Добавлен:
13.02.2015
Размер:
1.71 Mб
Скачать

10.5.2. Директивы fаr и near

Как правило, компилятор Тurbo Раscal автоматически выбирает адресацию к подпрограмме. Например, если подпрограмма находится в одном файле с основной программой, то она компилируется с "ближним" (near) адресом входа и воз­врата, состоящим только из смещения в текущем сегменте, а если она находятся в модуле, то формируется "дальний" (far) адрес, состоящий из адреса сегмента и смещения.

В некоторых случаях нужен нестандартный вариант компиляции. Так, например, если подпрограмма используется для переменных процедурного типа, она независимо от своего расположения должна компилироваться с получением “дальнего” адреса. В этом случае в подпрограмме можно использовать директиву far, которая сообщит компилятору, что нужно формировать именно такой адрес. Эта директива эквивалентна ключу компилятора {$F+}, однако в отличие от этого ключа действие директивы распространяется только на одну подпрограмму.

Реже используется директива near, которая сообщает компилятору, что подпрограмму следует компилировать с получением именно такого адреса. Эта директива эквивалентна ключу компилятора {$F-}, который выбирается по умолчанию. Действие директивы распространяется только на одну подпрограмму.

10.5.3. Директива ехтеrnal

Директива ехternal позволяет использовать в программе подпрограммы напиcанные на языке ассемблера и скомпилированные отдельно. Эти подпрограммы должны быть скомпонованы с основной программой, используя ключ {$L <имя файла>}. Здесь имя файла - имя того файла (с расширением .ОBJ), в котором находятся скомпилированные объектные модули подпрограмм, написанных на языке ассемблера.

Пример.

function Мах(Х, У: Reаl): Rеа1; ехternаl;

рrосеdure Search(var Mas; N: Integer;

vаr Мах, Мin: Integer); external;

{$L АSMBL.ОВJ}

Директиву ехternal следует использовать, если подпрограммы на ассемблере имеют большой размер и их лучше скомпилировать отдельно, а не использовать встроенный ассемблер или писать их в кодах, процессора, используя директиву inline(см. п. 10.5.5);

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

Директива assembler позволяет написать подпрограмму полностью на языке ассемблера. При этом во время компиляции подпрограмма будет автоматически скомпилирована встроенным ассемблером пакета Тurbo Pascal. При отладке такой подпрограммы можно использовать встроенный отладчик пакета.

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

function МахTwo(Х, У: Integer): Integer; assembler;

asm

MOV AX,X

CMP AX,Y

JG @1

MOV AX,Y

@1:

end;

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

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

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

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

function МахTwo(Х, У: Integer): Integer;

inline(

$58/ {РОР АХ - получение У из стека }

$5А/ { РОР DХ - получение Х из стека }

$3В/$С2/ {СМР АХ,DX}

$7F/$02/ { JG - переход через одну команду }

$8В/$С2); { МОV АХ, DХ}

В связи с тем, что такие подпрограммы являются макроопределениями и по­мещаются всюду, где осуществляется их вызов, нет необходимости организовы­вать стандартный вход в подпрограмму и выход из нее с сохранением и восста­новлением регистров. По этой причине такие подпрограммы являются довольно эффективными по быстродействию и объему занимаемой памяти. Однако ис­пользовать их целесообразно лишь в случаях, когда они являются достаточно короткими (не более десятка команд).