Синтаксис ассемблерных команд
Для доступа к полям записей разрешается использование составных имен. Например:
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
Непосредственные выражения – это нетипизированные константы и имена типов. Примеры непосредственных выражений:
const dec =10; ….. asm mov ax, dec mov bx,0 add cx,2*dec+l sub dh, -5 end;
Все остальные выражения относятся к ссылкам на память. Например:
const dec: Word = 10; Step =12; var Х,Y: Byte; asm mov ax, dec mov ex, [Step] add ah,X mov Y,bl mov ax,[bx] end;