Выражения встроенного ассемблера подразделяются на три клас-
са: регистровые значения, ссылки на память и непосредственные
значения.
Выражение, состоящее только из имени регистра, является ре-
гистровым значением. Примерами регистровых значений являются AX,
CL, DI и ES. Используемые в качестве операндов, регистровые выра-
жения указывают ассемблеру на необходимость генерировать инструк-
ции, которые работают с регистрами ЦП.
Выражения, обозначающие адреса памяти, являются ссылками на
память. К этой категории относятся метки Паскаля, переменные, ти-
пизованные константы, процедуры и функции.
Выражения, которые не являются регистровыми и не связаны с
ячейками памяти, представляют собой непосредственные значения.
Эта группа включает в себя нетипизированные константы и идентифи-
каторы типа.
Непосредственные значения и ссылки на память при использова-
нии их в качестве операндов приводят к генерации различного кода.
Например:
const
Start = 10;
var
Count: Integer;
.
.
.
asm
mov ax,Start { MOV AX,xxxx }
mov bx,Count { MOV BX,[xxxx] }
mov cx,[Start] { MOV CX,[xxxx] }
mov dx,OFFSET Count { MOV DX,xxxx }
end;
Поскольку Start - это непосредственное значение, первая инс-
трукция MOV ассемблируется в непосредственную инструкцию. Однако
вторая инструкция MOV транслируется в инструкцию, ссылающуюся на
память, так как Count - это ссылка на память. В третьей инструк-
ции MOV для преобразования Start в ссылку на память (в данном
случае слово со смещением 10 в сегменте данных) используется опе-
рация квадратных скобок. В четвертой инструкции MOV для преобра-
зования Count в непосредственное значение (смещение Count в сег-
менте данных) используется операция OFFSET.
Как вы можете видеть, квадратные скобки и операция OFFSET
дополняют друг друга. В терминах результирующего машинного кода
следующий оператор asm идентичен первым двум строкам предыдущего
оператора asm:
asm
mov ax,OFFSET [Start]
mov bx,[OFFSET Count]
end;
Ссылки на память и непосредственные значения классифицируют-
ся, в свою очередь, как перемещаемые и абсолютные выражения. Пе-
ремещаемое выражение обозначает значение, которое требует на эта-
пе компоновки перемещения, а абсолютное выражение обозначает зна-
чение, которое такого перемещения не требует. Обычно выражение со
ссылкой на метку, переменную процедуру или функцию является пере-
мещаемым, а выражение, где операции выполняются исключительно с
константами - абсолютным.
Перемещение является процессом, с помощью которого компонов-
щик присваивает идентификаторам абсолютные адреса. На этапе ком-
поновки компилятору неизвестны конечные адреса метки, переменной,
процедуры или функции. Они не будут известны до этапа компоновки,
на котором компоновщик присваивает идентификатору конкретный аб-
солютный адрес.
Встроенный ассемблер позволяет вам выполнять любую операцию
с абсолютным значением, но операции с перемещаемыми значениями
ограничиваются сложением и вычитанием констант.