Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Развёрнутые лекции по Паскалю.doc
Скачиваний:
8
Добавлен:
01.03.2025
Размер:
512.51 Кб
Скачать

30.Встроенный ассемблер

Доступ к встроенному Ассемблеру осуществляется через оператор

Asm. Синтаксис этого оператора выглядит почти также, как структур-

ный оператор, а именно

Asm

<операторы ассемблера>

End;

Примечания:

->В одной строке можно размещать несколько операторов, отделяя

их точкой с запятой, в противном случае точка не требуется.

->Комментарии оформляются по правилам Паскаля.

->Встроенный Ассемблер вычисляет все выражения в виде 32-раз-

рядных целых чисел и не поддерживает вещественных чисел.

->Операторы Ассемблера не должны изменять регистры Bp,Sp,Ss,Ds.

->Метки оформляются по правилам Паскаля, за исключением лока-

льных. Локальные метки начинаются с символя @x..x и могут не

объявляться.

30.1.Объявление операндов

Встроенный Ассемблер поддерживает только три директивы опреде-

ления данных: Db/Dw/Dd - определить байт/слово/двойное слово. Каж-

дая из них генерирует данные в соответствии с операндами, разделен-

ными запятыми, которые следуют за директивой. Генерируемые директи-

вами Db ,Dw, Dd данные запоминаются в сегменте кода.

->Директива Db генерирует последовательность байт. Каждый опе-

рант может быть константным выражением со значеним в диапа-

зоне от -127 до 255 или строкой символов любой длины, в пос-

леднем случае генерируется несколько байт.

->Директива Dw генерирует последовательность слов. Каждый опе-

ранд может быть константным выражением со значением в диапа-

зоне от -32768 до 65535 или адресным выражением, в последнем

случае генерируется короткий указатель - смещение адреса.

->Директива Dd генерирует последовательность двойных слов. Ка-

ждый операнд может быть константным выражением со значением

в диапазоне -2147483648 до 4294967295 или адресным выражени-

ем, в последнем случае генерируется длинный указатель, соде-

ржащий смещение и, далее, сегмент.

->Для генерации данных в сегменте данных их следует объявлять

по правилам Паскаля с использованием Var и Const и распола-

гать до оператора Asm.

Пример 91.

Asm

Db OFFH {один байт}

Db 0,9 {два байта}

Db 'A' {символ}

Db 'Hello..',ODH,OAH {строка, завершаемая CR/CF}

Dw 0,9999 {два слова}

Dw 'A' {аналог Db 'A',0}

Dw 'BA' {аналог Db 'A','B'}

Dw MyVar {смещение MyVar}

Dw MyProc {смещение MyProc}

Dd 0,99999999 {два двойных слова}

Dd 'A' {аналог Db 'A',0,0,0}

Dd MyVar {указатель на MyVar}

Dd MyProc {Указатель на MyProc}

End;

Встроенный Ассемблер имеет набор зарезервированных слов, кото-

рые не рекомендуется давать собственным идентификаторам.

Ah Cs Low Si

Al Cx Mod Sp

And Dh Near Ss

Ax Di Not St

Bh Dl Ofset TByte

Bl Ds Or Type

Bp DWord Ptr Word

Bx Dx QWord Xor

Byte Es Seg

Ch Far Shl

Cl High Shr

Зарезервированные слова всегда имеют преимущество перед иден-

тификаторами, определенными пользователями. Перед идентификатором,

совпадающим с зарезервированным словом, следует указавыть амперсанд

&, например, &Ch.

Наиболее важным различием между Паскалем и Ассемблером заклю-

чается в том, что все выражение встроенного Ассемблера имеют посто-

янную величину, которая может быть вычислена во время компиляции.

Так допустимым является фрагмент программы

Const X=10;

Y=20;

Var Z:Integer;

Asm

Mov Z,X+Y

End;

В то же время следующий фрагмент недопустим

Var X,Y,Z:Integer;

Asm

Mov Z.X+Y

End;

В последнем случае правильной записью будет набор операторов

Asm

Mov Ax,X

Add Ax,Y

Mov Z,Ax

End;

По умолчанию Ассемблер поддерживает десятичную систему исчис-

ление, однако может поддерживать и другие. Двоичное представление

указывается с помощью буквы B после числа, восьмиричное O, шестнад-

цатиричное H после числа или префиксом $ перед числом. В любом слу-

чае число должно начинаться с цифры. Если необходимо записать шест-

надцатиричное число, начинающееся с буквы, следует вначале дописать

ноль, иначе он будет воспринят как идентификатор.

Строковые константы должны быть заключены в кавычки или апост-

рофы.