Использование turbo pascal с языком ассемблера. Встроенный ассемблер, страница 9

":" относится к сегменту с именем сегментного регистра (CS, DS, SS,

ES) до ":".  Результат - ссылка на память  со  значением  выражения после ":".   Когда  перекрытие  сегмента  используется  в  операнде инструкции, инструкция будет предварена  соответствующим  префиксом перекрытия сегмента,   гарантируя,   что   будет  выбран  указанный сегмент.

OFFSET

Возвращает смещение  (младшее слово) выражения,  следующего за оператором. Результат - непосредственное значение.

SEG

Возвращает сегментную   часть   (старшее   слово)   выражения, следующего за оператором. Результат - непосредственное значение.

TYPE

Возвращает тип  (размер  в  байтах)  выражения,  следующего за оператором. Тип непосредственного значения - 0.

PTR

Оператор приведения  типа.  Результат  -  ссылка  на память со значением выражения,  следующего за оператором и  типом  выражения, стоящего перед оператором.

"*"

Умножение. Оба    выражения    должны     быть     абсолютными непосредственными значениями     и     результат    -    абсолютное непосредственное значение.

/

Целое деление.   Оба   выражения   должны   быть   абсолютными непосредственными   значениями    и    результат    -    абсолютное непосредственное значение.

MOD

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

SHL

Логический сдвиг влево.  Оба выражения должны быть абсолютными непосредственными   значениями    и    результат    -    абсолютное непосредственное значение.

SHR

Логический сдвиг вправо. Оба выражения должны быть абсолютными непосредственными    значениями    и    результат    -   абсолютное непосредственное значение.

"+"

Сложение. Выражения  могут  быть  непосредственными значениями или ссылками к памяти,  но только  одно  из  выражений  может  быть перемещаемым значением.  Если  одно  из  выражений  -  перемещаемое значение, то результат так же перемещаемое значение.  Если одно  из выражений - ссылка на память, то результат так же ссылка на память.

"-"

Вычитание. Первое выражение может быть любого класса, а второе выражение должно   быть   абсолютным   непосредственным  значением.

Результат того же класса, что и первое значение.

NOT

Побитовое отрицание.    Выражение   должно   быть   абсолютным непосредственным    значением    и    результат    -     абсолютное непосредственное значение.

AND

Побитовое "и".   Оба   выражения   должны   быть   абсолютными непосредственными    значениями    и    результат    -   абсолютное непосредственное значение.

OR

Побитовое "или".   Оба   выражения   должны  быть  абсолютными непосредственными   значениями    и    результат    -    абсолютное непосредственное значение.

XOR

Побитовое исключающее  "или".  Оба   выражения   должны   быть абсолютными  непосредственными  значениями и результат - абсолютное непосредственное значение.

Ассемблерные процедуры и функции.

До сих  пор  каждая  конструкция  asm...end  была  заключена в операторную часть begin...end.  Ассемблерная директива Turbo Pascal

позволяет Вам   написать   процедуру   или   функцию  полностью  на встроенном Ассемблере,  не требуя  операторной  части  begin...end.

Пример ассемблерной функции:

function LongMul(X, Y: Integer): Longint; assembler;

asm

mov   ax,X

imul  Y

end;

Директива Ассемблера  заставляет  Turbo  Pascal  выполнить ряд оптимизаций при генерации кода:

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