Иллюстрированный самоучитель по Turbo Pascal

Синтаксис ассемблерных команд

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

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;
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.