Использование ассемблера с 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
.