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

           

Числовые константы могут быть только



'Строковая константа'
"Это - тоже строковая константа"
'Символ '' не считается ограничителем'
'внутри строки, обрамленной кавычками "..."'
Числовые константы могут быть только целыми и их значение не может превосходить емкости двойного слова, т.е. должно быть внутри диапазона
- 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
Непосредственные выражения - это нетипизированные константы и имена типов.

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