3.2.1. Синтаксис Intel

На верх  Назад  Вперёд

Free Pascal в своих блоках asm поддерживает синтаксис Intel для семейства процессоров Intel Ix86.Синтаксис Intel в вашем блоке asm преобразуется компилятором в синтаксис AT&T, после чего ассемблерный блок вставляется в компилируемый исходный код. Поддерживаемые конструкции ассемблера являются поднабором обычного синтаксиса ассемблера. Из этого следует, что специфические конструкции не поддерживаются в Free Pascal, но существуют в Turbo Pascal:

Квалификатор TBYTE не поддерживается.

Идентификатор & не поддерживается.

Оператор HIGH не поддерживается.

Оператор LOW не поддерживается.

Операторы OFFSET и SEG не поддерживаются. Используйте LEA и вариации инструкции Lxx вместо него.

Выражения со строковыми константами не допускаются.

Доступ к полям записей через скобки не допускается.

Преобразование типов с обычными типами Pascal не допускается, только распознаваемые типы ассемблера допускается преобразовывать.
Например:

mov al, byte ptr MyWord — допускается,
mov al, byte(MyWord) — допускается,
mov al, shortint(MyWord) –- НЕ допускается.

Преобразование типов с константами не допускается.
Например

const s= 10; const t = 32767;

в Turbo Pascal:

mov al, byte(s) –- бесполезное преобразование типов.
mov al, byte(t) –- ошибка синтаксиса!

Анализатор в обоих случаях выдаст ошибку.

Ссылки на выражения, содержащие только константы, не допускаются (во всех случаях они не работают в защищённом режиме, например, под LINUX i386 ).

Примеры:

mov al,byte ptr ['c'] -- НЕ допускается.
mov al,byte ptr [100h] -- НЕ допускается.

(Это связано с ограничениями GNU Assembler ).

Скобки внутри квадратных скобок не допускаются.

Выражения с сегментами, находящиеся полностью в квадратных скобках, на текущий момент не поддерживаются, но они при необходимости могут быть реализованы в BuildReference.
Пример:

mov al,[ds:bx] -- НЕ допускается

используйте вместо этого:

mov al,ds:[bx]

Допустимые способы индексации:

Sreg:[REG+REG*SCALING+/-disp]

SReg:[REG+/-disp]– Sreg:[REG]

Sreg:[REG+REG+/-disp]

SReg:[REG+REG*SCALING]

Где Sreg является не обязательным и определяет сегмент.
Примечание:

1.В отличие от Turbo Pascal порядок следования имеет значение.

2.Значение Scaling должно быть числом, а не идентификатором или символом.

Примеры:

const myscale = 1;

mov al,byte ptr [esi+ebx*myscale] -- НЕ допускается.

используется:

mov al, byte ptr [esi+ebx*1]

Допустимы синтаксис идентификатора переменной выглядит следующим образом (ID = идентификатор переменной или типизированной константы):

1. ID

2. [ID]

3. [ID+expr]

4. ID[expr]

Допустимые поля записей следующие:

1. ID.subfield.subfield …

2. [ref].ID.subfield.subfield …

3. [ref].typename.subfield …

Локальные метки. В отличие от Turbo Pascal, локальные метки должны содержать, по крайней мере, один символ после указателя локальной метки.
Например:

@: -- НЕ допускается

используйте вместо этого:

@1: -- допускается

В отличие от Turbo Pascal, локальные ссылки не могут использоваться как ссылки, только как перемещения.
Например:

lds si,@mylabel -- НЕ допускается

В отличие от Turbo Pascal, сегменты SEGCS, SEGDS, SEGES и SEGSS в настоящее время не поддерживаются. (Их планируется добавить в будущем).

В отличие от Turbo Pascal, где спецификаторы размера памяти могут быть практически везде, встроенный ассемблер Free Pascal Intel требует использовать спецификаторы размера памяти внутри квадратных скобок.
Пример:

mov al,[byte ptr myvar] -- НЕ допускается.

Используйте:

mov al,byte ptr [myvar] -- допускается.

Регистры базы и индекса должны быть 32-разрядными (ограничение GNU Assembler ).

XLAT является эквивалентным XLATB.

Поддерживаются только опкоды Single и Double FPU.

Опкоды плавающей точки на текущий момент не поддерживаются (за исключением тех, которые связаны только с регистрами плавающей точки).

Встроенный ассемблер Intel поддерживает следующие макросы:

@Result - представляет результат работы функции и возвращает значение.

Self - представляет указатель на метод объекта в методах.