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 — допускается, •Преобразование типов с константами не допускается. const s= 10; const t = 32767; в Turbo Pascal: mov al, byte(s) –- бесполезное преобразование типов. Анализатор в обоих случаях выдаст ошибку. •Ссылки на выражения, содержащие только константы, не допускаются (во всех случаях они не работают в защищённом режиме, например, под LINUX i386 ). Примеры: mov al,byte ptr ['c'] -- НЕ допускается. (Это связано с ограничениями 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 - представляет указатель на метод объекта в методах. |