Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсова робота1_1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
287.23 Кб
Скачать

2. Ідентифікатори

-----------------------------------------------------------------------------------------------------

Ідентифікатори виступають як імена констант, типів змінних, процедур, модулів, програм і полів в записах.

Ідентифікатор може мати будь-яку довжину, проте тільки перші його 63 символи є значущими. Ідентифікатор повинен починатися з букви і не може містити пропусків. Після першого символу ідентифікатора можна використовувати букви, цифри і символи підкреслення (значення ASCII $5F). Як і в зарезервованих словах, в ідентифікаторах можна використовувати як рядкові, так і прописні букви (компілятор їх не розрізняє).

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

Вбудований асемблер дозволяє у виразах асемблера отримати доступ до всіх ідентифікаторів Паскаля, включаючи мітки, константи, типи, змінні, процедури і функції. Крім того, в вбудованому асемблері реалізовані наступні спеціальні ідентифікатори:

Code

Data

Result

Ідентифікатори Code і Data представляють поточні сегменти коду і даних відповідно. Їх слід використовувати тільки в поєднанні з операцією SEG:

asm

mov ах,SEG Data

mov ds,ax

end;

Ідентифікатор Result в операторній частині функції змінну-результат функції. Наприклад, у функції:

function Sum(X, У: Integer): Integer;

begin

Sum := X + У;

end;

в операторі, що привласнює результат функції змінної Sum, можна було б при записі на вбудованому асемблері використовувати змінну Result:

function Sum(X, У: Integer): Integer;

begin

asm

mov ах,X

add ах, У

mov Result,ax

end;

end;

У виразах вбудованого асемблера не можна використовувати наступні ідентифікатори:

- стандартні процедури і функції (наприклад, Writeln, Chr);

- спеціальні масиви Mem, MemW, MemL, Port, PortW;

- рядки, значення з плаваючою крапкою і константи множинного типу;

- мітки, які не описані в поточному блоці;

- ідентифікатор Result поза функцією.

Локальні змінні (змінні, описані в процедурах і функціях) завжди розподіляються в стеку і доступні відносно SS:BP, а значення ідентифікатора локальної змінної представляє собою її зсув із знаком від SS:BP. Асемблер автоматично додає [BP] до посилань на локальні змінні. Наприклад, з обліком описів:

procedure Test;

var

Count: Integer;

інструкції:

asm

mov ах,Count

end;

асемблюються в MOV АХ,[BP-2].

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

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

begin

asm

les bx,X

mov ах,es:[bx]

les bx,Y

add ах,es:[bx]

mov Result,ax

end;

end;

Деякі ідентифікатори, такі, як змінні типу запис мають область дії, що дозволяє поводитися до них з допомогою операції вибору елементи структури-крапки (.). Наприклад, з обліком описів:

type

Point = record

X, У: Integer;

end;

Rect = record

А, B: Point;

end;

var

P: Point;

R: Rect;

для доступу до полів в змінних P і R можна використовувати наступны конструкції:

asm

mov ах,P.X

mov dx,P.Y

mov cx,R.A.X

mov bx,R.B.Y

end;

Для безпосередньої побудови змінної можна використовувати ідентифікатор типу. Кожна з приведених нижче інструкцій генерує один і той же машинний код, що завантажує в АХ ES:[DI+4]:

asm

mov ах,(Rect PTR es:[di]).B.X

mov ах,Rect(es:[di].B.X

mov ах,es:Rect[di].B.X

mov ах,Rect[es:di].B.X

mov ах,es:[di].Rect.B.X

end;

Область дії задається типів, полем і ідентифікатором перемінної типу запису або об'єктного типу. Крім того, идентификатора модуля відкриває область дії конкретного модуля (як повністю уточнень ідентифікатор в Паскалі).