TURBO PASCAL |
Новости
|
Директивы inlineДирективы 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. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |