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



Идентификаторы - часть 2


Локальные переменные (переменные, описанные в процедурах и Функциях) всегда распределяются в стеке и доступны относительно SS:BP, а значение идентификатора локальной переменной представля- ет собой ее смещение со знаком от SS:BP. ассемблер автоматически добавляет [BP] к ссылкам на локальные переменные. Например, с учетом описаний:

procedure Test; var Count: Integer;

инструкции:

asm mov ax,Count end;

ассемблируются в MOV AX,[BP-2].

Встроенный ассемблер всегда интерпретирует параметр-перемен- ную, как 32-разрядный указатель, а размер параметра-переменной всегда равен 4 (размеру 32-разрядного указателя). В Паскале син- таксис для доступа к параметру-переменной и к значению параметра одинаков. В случае встроенного ассемблера это не так. Поэтому для доступа к содержимому параметра-переменной вам сначала придется загрузить 32-разрядный указатель, а затем обратиться к ячейке, на которую он указывает. Например, если X и Y - параметры-переменные приведенной выше функции Sum, то она может выглядеть следующим образом:

function Sum(var X, Y: Integer): Integer;

begin asm les bx,X mov ax,es:[bx] les bx,Y add ax,es:[bx] mov @Result,ax end; end;

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

type Point = record X, Y: Integer; end; Rect = record A, B: Point; end; var P: Point; R: Rect;

для доступа к полям в переменных P и R можно использовать следую- щие конструкции:

asm mov ax,P.X mov dx,P.Y mov cx,R.A.X mov bx,R.B.Y end;

Для непосредственного построения переменной можно использо- вать идентификатор типа. Каждая из приведенных ниже инструкций генерирует один и тот же машинный код, загружающий в AX ES:[DI+4]:

asm mov ax,(Rect PTR es:[di]).B.X mov ax,Rect(es:[di].B.X mov ax,es:Rect[di].B.X mov ax,Rect[es:di].B.X mov ax,es:[di].Rect.B.X end;

Область действия задается типов, полем и идентификатором пе- ременной типа записи или объектного типа. Кроме того, идентифика- тор модуля открывает область действия конкретного модуля (как полностью уточненный идентификатор в Паскале).




Содержание  Назад  Вперед