Руководство по языку B.Pascal 7

         

Директивы inline


Директивы inline позволяют писать процедуры и функции, кото- рые преобразуются при каждом вызове в заданную последовательность инструкций, представляющих собой машинный код. Синтаксис у дирек- тивы inline такой же, как у оператора inline:

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

При вызове обычной процедуры или функции (включая те, кото- рые содержат в себе операторы 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 }

Обратите внимание на отсутствие инструкций входа и выхода и инструкции возврата управления. Их присутствия не требуется, пос- кольку при вызове этой функции содержащиеся в ней четыре байта просто включаются в текст программы.

Директивы inline предназначены только для очень коротких (менее 10 байт) процедур и функций.

Из-за того, что процедуры и функции типа inline имеют харак- тер макроопределений, они не могут использоваться в качестве ар- гумента операции @ или в функциях Addr, Offs и Seg.



Содержание раздела