Читайте также:
|
|
Встроенный ассемблер использует выражения трех классов: регистровые, ссылки на память и непосредственные.
Регистровое выражение - это выражение, состоящее из имени регистра. Вес следующие команды содержат только регистровые выражения:
push ds
Pop es
mov ah,bl
Непосредственные выражения - это нетипизированные константы и имена типов. Примеры непосредственных выражений:
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
X,Y: Byte;
Asm
mov ax, dec
mov ex, [Step]
add ah, X
mov Y, bl
mov ax, [bx]
End;
Важным отличием ассемблерных выражений от выражений Турбо Паскаля является то обстоятельство, что они должны быть статическими, т.е. разрешены (вычислены)! на этапе создания программы. Если выражение может быть полностью вычислено к моменту его трансляции, т.е. если оно состоит только из регистровых или непосредственных значений, такое выражение называется абсолютным, компилятор вычисляет его и использует для создания команды.
В ходе компиляции программы вырабатывается так называемый объектный код, который затем преобразуется компоновщиком в готовую к работе программу. При создании объектного кода компилятор не может вычислить значения выражений типа «ссылка на память», так как не знает окончательного положения в памяти меток, переменных, подпрограмм. В результате он создает так называемое перемещаемое выражение, которое затем компоновщиком преобразуется в нужную ссылку на память.
Встроенный ассемблер разрешает любую операцию над абсолютным значением, но ограничивает перемещаемые выражения до сложения или вычитания, одним из операндов которого должна быть константа.
Другое важное отличие ассемблерных выражений от выражений Турбо Паскаля заключается в способе интерпретации переменных. В выражениях Паскаля любая ссылка на переменную интерпретируется как текущее содержимое этой переменной. В ассемблерных выражениях это справедливо только тогда, когда все выражение в целом состоит из имени переменной. Во всех остальных случаях ссылка на переменную интерпретируется как адрес переменной. Например, выражение
Х+10
в Паскале означает: «к содержимому переменной X прибавить 10». В ассемблерной команде это означает: «к адресу (смещению) переменной X прибавить 10». Однако команда
mov ax, X
означает: «поместить в регистр АХ первые два байта переменной X». Если бы нам понадобилось загрузить в АХ адрес переменной X, мы должны были бы написать
mov ax, OFFSET X
Попытка «перехитрить» ассемблер командами типа
mov ax, X+0
mov ax, X+1 – 1
и т.п. не дает желаемого результата: ассемблер просто загружает в АХ содержимое переменной X.
Как и в Паскале, ассемблерные выражения имеют тип, но в отличие от Паскаля этот тип определяет только размер объекта в памяти и не ограничивает применяемые к нему операции.
Встроенный ассемблер имеет следующие предопределенные типы:
Тип | Длина в памяти |
BYTE | |
WORD | |
DWORD | |
QWORD | |
TBYTE | |
NEAR | - |
FAR | - |
Имена предопределенных типов можно использовать для приведения типов выражений. Например, если определены переменные
var
Flag: Boolean; X: Word;
то такие ассемблерные выражения недопустимы:
mov Flag, bx
mov ah, X
Для корректного задания последней команды можно использовать следующие варианты:
mov ah, BYTE PTR X
mov ah, Byte(X)
mov ah, X.Byte
Во всех случаях в АН будет загружен первый (младший) байт переменной X.
Дата добавления: 2014-12-19; просмотров: 101 | Поможем написать вашу работу | Нарушение авторских прав |