Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Классы выражений

Выражения встроенного ассемблера подразделяются на три клас-

са: регистровые значения, ссылки на память и непосредственные

значения.

Выражение, состоящее только из имени регистра, является ре-

гистровым значением. Примерами регистровых значений являются 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;

Ссылки на память и непосредственные значения классифицируют-

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

ремещаемое выражение обозначает значение, которое требует на эта-

пе компоновки перемещения, а абсолютное выражение обозначает зна-

чение, которое такого перемещения не требует. Обычно выражение со

ссылкой на метку, переменную процедуру или функцию является пере-

мещаемым, а выражение, где операции выполняются исключительно с

константами - абсолютным.

Перемещение является процессом, с помощью которого компонов-

щик присваивает идентификаторам абсолютные адреса. На этапе ком-

поновки компилятору неизвестны конечные адреса метки, переменной,

процедуры или функции. Они не будут известны до этапа компоновки,

на котором компоновщик присваивает идентификатору конкретный аб-

солютный адрес.

Встроенный ассемблер позволяет вам выполнять любую операцию

с абсолютным значением, но операции с перемещаемыми значениями

ограничиваются сложением и вычитанием констант.

Соседние файлы в предмете Программирование на Pascal