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

       

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


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

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

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

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

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



Содержание раздела