Использование ассемблера с 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.
| FPC | 3.2.2 | release |
| Lazarus | 3.2 | release |
| MSE | 5.10.0 | release |
| fpGUI | 1.4.1 | release |