Використання асемблера із 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.