Публикации FreePascal

Использование ассемблера с Free Pascal

18.04.2005
Иван Шихалев

В целом работа со встроенным ассемблером и подключение внешних объектных модулей происходит аналогично 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.

Актуальные версии
FPC3.2.2release
Lazarus3.2release
MSE5.10.0release
fpGUI1.4.1release
links