Использование turbo pascal с языком ассемблера. Встроенный ассемблер, страница 4

XOR

Зарезервированные слова    всегда    имеют    приоритет    над идентификаторами пользователя. Например фрагмент кода:

VAR

Ch: Char;

...

asm

mov   ch,1

end;

загружает 1 в регистр CH,  а не в переменную Ch. Для доступа к символу, определенному пользователем с тем  же  именем,  Вы  должны использовать & для перекрытия оператора:

asm

mov   &ch,1

end;

Мы настоятельно    рекомендуем    Вам   избегать   определения идентификаторов с теми же именами,  что и  зарезервированные  слова встроенного Ассемблера,    поскольку    это    может   привести   к труднонаходимым ошибкам.

Выражения.

Встроенный Ассемблер  вычисляет все выражения,  как 32-битовые целые выражения;  он не поддерживает значения с плавающей точкой  и строковые значения, за исключением строковых констант.

Выражения встроенного   Ассемблера   строятся   из   элементов выражения и операторов и каждое выражение связано с классом и типом выражения. Эти концепции объясняются в следующих разделах.

Различия между выражениями Паскаля и Ассемблера.

Наиболее важное   отличие   между   выражениями   Паскаля    и встроенного Ассемблера в том,  что выражения встроенного Ассемблера должны разрешаться в константное  значение,  т.е.  значение  должно быть вычислено во время компиляции. Например, для объявлений

const

X = 10;

Y = 20;

var

Z: Integer;

следующий оператор разрешен:

asm

mov   Z,X+Y

end;

Поскольку X  и  Y - константы,  выражение X+Y наиболее удобный способ написания константы 30,  а результирующая  инструкция  будет пересылать непосредственное значение 30 в переменную Z,  размером в слово. Но если Вы объявите X и Y как переменные:

var

X, Y: Integer;

встроенный Ассемблер не сможет вычислить значение X+Y во время компиляции. Встроенный    Ассемблер   для   пересылки   суммы   X+Y

генерирует:

asm

mov   ax,X

add   ax,Y

mov   Z,ax

end;

Другое важное отличие между выражениями Паскаля  и встроенного

Ассемблера в способе интерпретации переменных.  В выражении Паскаля ссылка на переменную интерпретируется как содержимое  переменной, а в выражении  встроенного  Ассемблера  ссылка на переменную означает адрес этой переменной.  Например,  в Паскале выражение X+4, где Х переменная, означает содержимое X+4, а во встроенном Ассемблере это означает содержимое слова с адресом на 4 байта выше,  чем адрес  Х.

Так даже если Вы можете написать

asm

mov   ax,X+4

end;

этот код не загружает значение Х+4 в AX,  а загружает значение слова, хранящегося по адресу на 4 байта выше Х.  Корректный  способ добавить 4 к содержимому Х:

asm

MOV   AX,X

ADD   AX,4

end;

Элементы выражения.

Основные элементы  выражения  -  это  константы,  регистры   и символы.

Константы.

Встроенный Ассемблер поддерживает 2  типа  констант:  числовые константы и строковые константы.

Числовые константы.

Числовые константы должны быть целыми  и  их  значения  должны быть в диапазоне от -2,147,483,648 до 4,294,967,295.

Числовые константы по умолчанию используют десятичную нотацию, но встроенный Ассемблер так же поддерживает двоичную, 8-ричную и 16

-ричную нотации.  Двоичная  нотация  выбирается  написанием В после числа, 8-ричная нотация выбирается написанием буквы О после числа и

16-ричная нотация  выбирается  написанием  Н  после  числа или $ до числа.

Примечание: Суффиксы B,  O,  H не поддерживаются в  выражениях

Паскаля. Выражения  Паскаля допускают только десятичную нотацию (по умолчанию) и 16-ричную нотацию (используя префикс $).

Числовые константы должны начинаться с одной из цифр  0..9 или символа $;  так,  когда  Вы  пишите 16-ричную константу,  используя суффикс Н,  требуется дополнительный 0 в начале числа,  если первая значащая цифра  одна  из  16-ричных цифр А..F.  Например,  0BAD4H и

$BAD4 - 16-ричные константы,  а BAD4H  -  идентификатор,  поскольку начинается с буквы, а не с цифры.

Строковые константы.