Використання асемблера із Free Pascal
В цілому робота із вбудованим асемблером та підключення зовнішніх об'єктних модулів відбувається аналогічно Turbo Pascal та Borland Delphi. Істотна відмінність - можливість використовувати асемблер синтаксису AT&T замість звичного Intel'ловського (директива). Слід також пам'ятати, що формат .obj-файлів, який підтримується Free Pascal - COFF, а не OMF.
За наявності відповідного ключа командного рядка можна компілювати паскалівський код асемблер. Також існує можливість компілювати код на Паскалі в асемблер, що не відповідає GNU AS, а іншим типам асемблера (MASM, TASM, NASM і т.д.). Це визначається директивою компілятора.
Замість. вказується одне з трьох значень - ATT, INTEL, DIRECT (за умовчанням ATT).
- ATT - AT&T-синтаксис, використовуваний, наприклад, GNU AS.
- INTEL - Intel-синтаксис, добре знайомий багатьом за MASM і TASM, саме його використовує вбудований асемблер Turbo Pascal та Delphi.
- DIRECT означає, що asm-вставка безпосередньо копіюватиметься в проміжний asm-код. Цей варіант може бути корисним при використанні спільно з директивою, щоб у вставці використовувати всі можливості зовнішнього асемблера.
Потрібно відзначити, що синтаксиси AT&T і Intel сильно відрізняються. Я, наприклад, незважаючи на те, що "рідний" для FPC синтаксис - AT&T, завжди виставляю просто тому, що звик.
Вбудований асемблер синтаксису Intel дещо обмежений:
- Не підтримується модифікатор TBYTE. У результаті немає можливості працювати з типом extended . Нагадаю, що в синтаксисі AT&T розмірність операндів визначається суфіксом, що додається до мнемоніки команди.
- Не підтримуються оператори HIGH, LOW, OFFSET та SEG.
Ця директивавідповідає ключу командного рядка -R.
Замість. вказується одне з наступних значень: 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.