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

       

Идентификаторы


Идентификаторы выступают в качестве имен констант, типов, переменных, процедур, модулей, программ и полей в записях.

Идентификатор может иметь любую длину, однако только первые его 63 символа являются значимыми. Идентификатор должен начинать- ся с буквы и не может содержать пробелов. После первого символа идентификатора можно использовать буквы, цифры и символы подчер- кивания (значение ASCII $5F). Как и в зарезервированных словах, в идентификаторах можно использовать как строчные, так и прописные буквы (компилятор их не различает).

Идентификатор должен начинаться с буквы и не должен содер- жать пробелов. После первого символа допускаются буквы, цифры и символ подчеркивания (ASCII $5F). Как и зарезервированные слова, идентификаторы безразличны к регистру клавиатуры.

Когда имеется несколько мест с указанием одного и того же идентификатора, для задания нужного идентификатора необходимо уточнить этот идентификатор с помощью идентификатора модуля. Нап- ример, для уточнения идентификатора Ident с помощью идентификато- ра модуля UnitName следует записать UnitNamt.Ident. Такой комби- нированный идентификатор называется уточненным идентификатором.

Примечание: Модули описываются в Главе 7 "Руководства пользователя" и в Главе 10 данного руководства.

------------ Идентификатор --T--->¦ буква ¦-------------------------T-> ¦ L------------ ^ ^ ¦ ¦ -------------- ¦ ¦ ¦ L->¦ символ +-- ¦ -------------- ¦ ¦подчеркивания¦ +---+ буква ¦<--+ L-------------- ¦ L-------------- ¦ ¦ -------------- ¦ +---+ цифра ¦<--+ ¦ L-------------- ¦ ¦ -------------- ¦ L---+ символ ¦<--- ¦подчеркивания¦ L--------------

---- символ подчеркивания----->¦ _ ¦-----> L----

идентификатор программы -------------- идентификатор модуля ----->¦идентификатор¦----> идентификатор поля L--------------

---------------- уточненный --T---------------------------+ идентификатор +--> идентификатор ¦ ^ L---------------- ¦ -------------- ---- ¦ L->¦идентификатор+->¦ . +-- ¦ модуля ¦ L---- L--------------

Приведем несколько примеров идентификаторов:

Writeln Exit Real2String System.MemAvail Dos.Exec WinCrt.Windows


Локальные переменные (переменные, описанные в процедурах и Функциях) всегда распределяются в стеке и доступны относительно 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;

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


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