Система программирования Turbo Pascal




Примеры 3


'Строковая константа'

"Это - тоже строковая константа"

'Символ '' не считается ограничителем'

'внутри строки, обрамленной кавычками "..."'

Числовые константы могут быть только целыми и их значение не может превосходить емкости двойного слова, т.е. должно быть внутри диапазона

- 2 147 483 648...+ 4 294 967 295.

По умолчанию при записи числовых констант используется десятичная нотация, но ассемблер поддерживает также двоичные, восьмеричные и шестнадцатеричные константы. Двоичная константа составляется как комбинация единиц и нулей, заканчивающаяся символом В (от Binary - двоичный); при записи восьмеричной константы используются символы 0...7, а в ее конце ставится символ О (Octal - восьмеричный); шестнадцатеричная константа записывается по правилам Турбо Паскаля (начинается с символа #) либо по правилам Турбо Ассемблера: начинается с цифры, в конце ставится символ H (от Hexadecimal - шестнадцатеричный).

Имена

Локальные метки - это единственные имена, которые разрешается определять внутри ассемблерного оператора. Имена остальных объектов программы - констант, переменных, подпрограмм - должны определяться только с помощью средств Турбо Паскаля.

Область определения имен подчиняется тем же правилам, что и в Турбо Паскале -имена должны быть «видны» в том месте, где они используются, и они локализуются в пределах блока, в котором описаны.

Во встроенном ассемблере могут использоваться три предопределенных имени:

@@Code - текущий сегмент кода

@Data - начальный сегмент данных

@Result - ссылка внутри функции на ее результат

Имена @Code и @Data могут использоваться только в сочетании с директивой SEG для ссылки на нужный сегмент. Например:

asm

mov ax, SEG ©Data

mov ds,ax 

end;

Имя @Result используется для присвоения результата функции. Например:

Function Min(X,Y: Integer): Integer; 

{Эта функция сравнивает два целых числа и возвращает наименьшее из них) 

begin 

asm

mov ax,X {Помещаем Х в АХ} 

cmp ax,Y {X<Y ?}

jl @ {Да - на выход}

mov ax,Y {Нет - помещаем Y в АХ} 

@: mov ©Result,ax {АХ содержит результат}

end 

end;

Для доступа к полям записей разрешается использование составных имен. Например:

type

Point = record X,Y: Integer 

end; 

Rect = record

A,B: Point 

end; 

var

P: Point; 

R: Rect; 

begin 

asm

mov ax,P.X 

add ax,P.Y

mov R.A.X,ax 

end 

end.

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

mov ax,(Rect PTR es:[di]).В.Х

mov ax,Rect(es:[di]).В.Х

mov ax,esrRect[di].B.X

mov ax,Rect[es:di].B.X

mov ax,es:[di].Rect.B.X

Следующие имена не могут использоваться в операндах встроенного ассемблера:

  • стандартные процедуры и функции (например, WriteLn, Chr);
  • предопределенные массивы Mem, MemW, MemL, Port, PortW;
  • константы с плавающей точкой, строковые и множественного типа;
  • макросы (процедуры и функции, полностью реализуемые одним InLine-оператором);
  • символ
  • @Result вне функции.

Выражения

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

Регистровое выражение - это выражение, состоящее из имени регистра. Все следующие команды содержат только регистровые выражения:

push ds 

pop es 

mov ah,bl 

add ex,ax

Непосредственные выражения - это нетипизированные константы и имена типов.







Начало  Назад  Вперед



Книжный магазин