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


Процедуры и функции ассемблера


До сих пор мы рассматривали конструкцию asm...end, как опе- ратор с обычной частью begin...end. Директива assembler в Borland Pascal позволяет вам писать на встроенном ассемблере целиком про- цедуры и функции без необходимости begin...end. Приведем пример функции на ассемблере:

function LongMul(X, Y: Integer) : Longint; assembler; asm mov ax,X imul Y end;

Директива assembler приводит к тому, что Borland Pascal вы- полняет при генерации кода следующую оптимизацию:

- Компилятор не генерирует код для копирования парамет- ров-значений в локальные переменные. Это влияет на все па- раметры-значения строкового типа и другие значения-пара- метры, размер которых не равен 1, 2 или 4 байтам. Внутри процедуры или функции такие параметры должны интерпретиро- ваться, как если бы они были параметрами-переменными.

- Компилятор не выделяет память для результата функции, и ссылка на идентификатор @Result будет ошибкой. Однако строковые функции являются исключением из этого правила - они всегда имеют указатель @Result, который распределяется пользователем.

- Для процедур и функций, не имеющих параметров и локальных переменных, компилятор не генерирует кадров стека.

- Для процедуры и функции на ассемблере автоматически гене- рируется код выхода:

push bp ; присутствует, если Locals <> 0 или ; Params <> 0 mov bp,sp ; присутствует, если Locals <> 0 или ; Params <> 0 sub sp,Locals ; присутствует, если Locals <> 0 ... mov sp,bp ; присутствует, если Locals <> 0 pop bp ; присутствует, если Locals <> 0 или ; Params <> 0 ret Params ; всегда присутствует

где Locals - размер локальных переменных, а Params - раз- мер параметров. Если и Locals и Params = 0, то кода входа не будет, и код выхода состоит просто из инструкции RET.

Функции, использующие директиву assembler, должны возвращать результат следующим образом:

- результаты функции порядкового типа (Integer, Char, Boolean, перечислимые типы) возвращаются в AL (8-разрядное значение), AX (16-разрядное значение) или DX:AX (32-раз- рядное значение);




Начало  Назад  Вперед



Книжный магазин