Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект_ лекций по Паскалю_ИиКТ.doc
Скачиваний:
12
Добавлен:
24.09.2019
Размер:
2.85 Mб
Скачать

Директива external

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

Пример.

function Max(X, Y, : Real) : Real ; external ;

procedure Search(var Mas ; N : Integer ;

var Max , Min : Integer) ; external ;

{$L ASMBL.OBJ}

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

Директива assembler

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

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

function Max(X, Y : Integer ) : Integer ; assembler ;

asm

MOV AX,X

CMP AX,Y

JG @1

MOV AX,Y

@1 :

end ;

Директива inline

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

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

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

function MaxTwo(X, Y : Integetr ) : Integer ;

inline(

$58/ { POP AX - получение Y из стека }

$5A/ { POP DX - получение X из стека }

$3B/$C2/ { CMP AX,DX }

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

$8B/$C2 ; { MOV AX,DX }

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

Директива interupt

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

procedure IntHandler(Flags, CS, IP, AX,

BX, CX, DX, SI, DI, DS, ES, BP : Word) ; interupt ;

begin

.

.

end ;

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

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

{ неправильный заголовок }

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

{ правильный заголовок }

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