В целом работа со встроенным ассемблером и
подключение
внешних объектных модулей происходит аналогично Turbo Pascal и Borland
Delphi. Существенное отличие - возможность использовать ассемблер
синтаксиса AT&T вместо привычного Intel'ловского (директива {$ASMMODE
...}). Следует также помнить, что формат .obj-файлов,
поддерживаемый Free Pascal — COFF, а не OMF.
При наличии соответствующего ключа командной
строки можно
компилировать паскалевский код в ассемблер. Также существует
возможность компилировать код на Паскале в ассемблер, соответствующий
не GNU AS, а другим типам ассемблера (MASM, TASM, NASM и т.д.). Это
определяется директивой компилятора {$OUTPUT_FORMAT ...}.
{$ASMMODE ...}
Вместо ... указывается одно из трех значений
— ATT, INTEL, DIRECT (по
умолчанию ATT).
ATT — AT&T-синтаксис,
используемый, например, GNU AS.
INTEL — Intel-синтаксис,
хорошо знакомый многим по MASM и TASM, именно его использует встроенный
ассемблер Turbo Pascal и Delphi.
DIRECT
— означает, что asm-вставка будет напрямую копироваться в промежуточный
asm-код. Данный вариант может быть полезен при использовании совместно
с директивой {$OUTPUT_FORMAT ...}, дабы во вставке
использовать все возможности внешнего ассемблера.
Нужно отметить, что синтаксисы AT&T и
Intel сильно отличаются.
Я, например, несмотря на то, что "родной" для FPC синтаксис — AT&T,
всегда выставляю {$ASMMODE INTEL}, просто потому, что
привык.
Встроенный ассемблер синтаксиса Intel
несколько ограничен:
Не поддерживается модификатор TBYTE.
В результате, нет возможности работать с типом extended.
Напомню, что в синтаксисе AT&T размерность операндов определяется
суффиксом, добавляемым к мнемонике команды.
Не поддерживаются операторы HIGH,
LOW, OFFSET и SEG.
Данная директива соответствует ключу
командной строки -R.
{$OUTPUT_FORMAT ...}
Вместо ... указывается одно из следующих
значений: AS, AS_AOUT, ASW, COFF,
MASM, NASM, NASMCOFF,
NASMELF, PECOFF, TASM.
По умолчанию для Win32 — PECOFF.
Должен заметить, однако, что на некоторых
значениях из этого списка
(взят из документации) компилятор выдает сообщение о
неподдерживаемом формате или неизвестном ключе.
Под Win32 реально имеет смысл использовать ASW,
COFF, NASMCOFF или NASMELF
(в силу "неразличимости" NASM), PECOFF (по умолчанию) и
TASM.
COFF и PECOFF
создают объектные файлы для GO32V2 и PE (Win32). А ASW, NASMCOFF,
NASMELF и TASM
пытаются сформировать объектные файлы через промежуточный
ассемблерный код соответственного синтаксиса. Чтобы это удалось,
необходимо иметь соответствующий ассемблер в том каталоге, где
находятся исполняемые файлы FPC.
Если компиляция проходит успешно,
промежуточные ассемблерные файлы
удаляются автоматически. Чтобы этого не происходило можно использовать
ключ командной строки -a.
Компиляция в TASM и NASM правильно
производится только при
отключенном smartlink, при включенном — в asm-файле расположение
параметров такое, как в синтаксисе AT&T (,
вместо , ).
Данная директива соответствует ключу
командной строки -A.