Директивы inline позволяют писать процедуры и функции, кото-
рые преобразуются при каждом вызове в заданную последовательность
инструкций, представляющих собой машинный код. Синтаксис у дирек-
тивы inline такой же, как у оператора inline:
┌────────────┐
директива ──────────────────────>│ оператор ├────────────>
inline │ inline │
└────────────┘
При вызове обычной процедуры или функции (включая те, кото-
рые содержат в себе операторы inline) компилятором генерируется
такой код, в котором параметры (если они имеются) помещаются в
стек, а затем уже для обращения к процедуре или функции генериру-
ется инструкция CALL. Однако, когда вы обращаетесь к процедуре
или функции типа inline, компилятор вместо инструкции CALL гене-
рирует код из директивы inline. Вот короткий пример двух директив
inline:
procedure DisableInterrupts; inline($FA); { CLI }
procedure EnableInterrupts; inline($FB); { STI }
Когда вызывается процедура DisableInterrupt то генерируется
один байт кода - инструкция CLI.
Процедуры или функции, описанные с помощью директив inline,
могут иметь параметры, однако на параметры нельзя ссылаться сим-
волически (хотя для других переменных это допускается). К тому
же, поскольку такие процедуры или функции фактически являются
макрокомандами, у них отсутствуют автоматический код с инструкци-
ями входа или выхода и никаких инструкций возврата управления не
требуется.
Следующая функция выполняет умножение двух целых значений, в
результате чего получается число длинного целого типа:
function LongMul(X,Y : Integer): Longint;
inline(
$58/ { POP DS ; извлечь из стека Y }
$5A/ { POP AX ; извлечь из стека X }
$F7/$EA); { IMUL DX ; DX:AX = X*Y }
Обратите внимание на отсутствие инструкций входа и выхода и
инструкции возврата управления. Их присутствия не требуется, пос-
кольку при вызове этой функции содержащиеся в ней четыре байта
просто включаются в текст программы.
B.Pascal 7 & Objects/LR - 445 -
Директивы inline предназначены только для очень коротких
(менее 10 байт) процедур и функций.
Из-за того, что процедуры и функции типа inline имеют харак-
тер макроопределений, они не могут использоваться в качестве ар-
гумента операции @ или в функциях Addr, Offs и Seg.