Большинство важных различий между выражениями Паскаля и вы-
ражениями встроенного ассемблера состоит в том, что выражения
встроенного ассемблера должны при вычислении сводиться к значе-
нию-константе, другими словами, к значению, которое можно вычис-
лить на этапе компиляции. Например, с учетом описаний:
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. Корректной конструкцией встроенного ассемблера в
этом случае будет:
asm
mov ax,X
add ax,Y
mov Z,ax
end;
Другим важным отличием выражений Паскаля и встроенного Ас-
семблера является способ интерпретации переменных. В выражении
Паскаля ссылка не переменную интерпретируется, как содержимое пе-
ременной, но в выражении встроенного ассемблера ссылка на пере-
менную означает адрес переменной. Например, в Паскале выражение X
+ 4, где X - переменная, означает содержимое X, плюс 4, а во
встроенном ассемблере это означает содержимое в слове по адресу
на 4 байта выше, чем адрес X. Поэтому, хотя допустима запись:
asm
mov ax,X+4
end;
этот код не загружает значения X, плюс 4 в AX, а загружает значе-
ние слова, записанного через 4 байта после X. Корректной записью
сложения 4 с содержимым X будет:
asm
MOV AX,X
ADD AX,4
end;