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


Процедуры и функции ассемблера - часть 2


- результаты функции вещественного типа (Real) возвращаются в DX:BX:AX;

- результаты функции типов 8087 (Single, Double, Extended, Comp) возвращаются в ST(0) (регистр стека сопроцессора 8087);

- результаты функции типа указатель возвращаются в DX:AX;

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

Директива assembler во многом похожа на директиву external. Процедуры и функции на ассемблере должны должны подчиняться тем же правилам, что и процедуры и функции типа external. Следующие примеры показывают некоторые отличия операторов asm в обычных процедурах и функциях от процедур и функций ассемблера. В первом примере оператор asm используется в обычной функции для преобра- зования строки в верхний регистр. Заметим, что значение параметра Str в этом случае ссылается на локальную переменную, поскольку компилятор автоматически генерирует код входа, копирующий факти- ческий параметр в локальную память.

function UpperCase(Str: String): String; begin asm cld lea si,Str les di,@Result SEGSS lodsb stosb xor ah,ah xchg ax,cx jcxz @3 @1: SEGSS lodsb cmp al,'a' ja @2 cmp al,'a' ja @2 cmp al,'z' jb @2 sub al,20H @2: stosb loop @1

@3: end; end;

Второй пример на ассемблере представляет собой версию функ- ции UpperCase. В этом случае Str не копируется в локальную па- мять, и функция должна интерпретировать Str, как параметр-пере- менную.

function UpperCase(S: String): String; assembler; asm push ds cld lds si,Str les di@Result lodsb stosb xor ah,ah xchg ax,cx jcxz @3 @1: lodsb cmp al,'a' ja @2 cmp al,'z' jb @2 sub al,20H @2: stosb loop @1 @3: pop ds end;

 




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



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