| Тип | асемблер |
|---|---|
| Розробник | Томаш Гриштар |
| Стабільний випуск | 1.71.17 (29 січня 2014) |
| Версії | 1.73.32 (4 грудня2023)[1] |
| Операційна система | DOS,DexOS,Win32,Linux,BSD,MenuetOS,KolibriOS |
| Мова програмування | асемблер |
| Ліцензія | ЛіцензіяBSD |
| Онлайн-документація | flatassembler.net/docs.php?article=manual(англ.) |
| Репозиторій | github.com/tgrysztar/fasm |
| Вебсайт | flatassembler.net |
FASM (flat assembler) —асемблер, для архітектур IA-32 та x86-64, використовує синтаксис Інтел. Відомий своєю швидкістю компіляції, оптимізацією розміру скомпільованого коду, портованістю на різні ОС та широкими можливостями препроцесора (макросами), що дозволяє автоматизувати безліч рутинних завдань. Він є низькорівневим асемблером та навмисно має лише невелику кількість опцій командного рядка.FASM є вільним та відкритим програмним забезпеченням.
FASM має біндинги доGUI таOpenGL на платформіWindows. Всі версії FASM можуть створювати файли таких форматів: «сирі» бінарники з пласкою адресацією (що використовуються передусім якDOS COM застосунки чи SYS драйвери), об'єктні файли:ELF чиCOFF (як класичного так і MS-орієнтованого вигляду), чи застосунки у форматах MZ, ELF, PE (включно з драйверамиWDM). Також існує неофіційний порт на архітектуруARM (FASMARM).[2]
Проєкт розпочав у 1999 році польський студент математики Томаш Гриштар. Перший публічний випуск був представлений 15 березня 2000 року. FASM сам повністю написаний на асемблері і йде із повним початковим кодом. З версії 0.90 FASM може скомпілювати свій власний код. Він використовувався для написання декількох операційних систем, включаючиMenuetOS таDexOS.
ПрикладWindows-програми«Hello, world!», яка викликає повідомлення за допомогою функціїMessageBox:
formatpegui4.0entrystartinclude'win32a.inc'start:invokeMessageBox,NULL,message,message,MB_OKinvokeExitProcess,0messagedb'Hello,World!',0dataimportlibrarykernel32,'kernel32.dll',\user32,'user32.dll'include'api/kernel32.inc'include'api/user32.inc'enddata
Або так:
include'win32ax.inc'.codemain:invokeMessageBox,NULL,'Hello,World!','Fasmmessagebox:',MB_OKinvokeExitProcess,0.endmain
Трохи складніша версія, з визначенням секцій вPE-файлі:
formatpeguientrystartinclude'win32a.inc'section'.data'datareadablewriteablemessagedb'Hello,World!',0section'.code'codereadableexecutablestart:invokeMessageBox,NULL,message,message,MB_OKinvokeExitProcess,0section'.idata'importdatareadablewriteablelibrarykernel32,'kernel32.dll',\user32,'user32.dll'importkernel32,\ExitProcess,'ExitProcess'importuser32,\MessageBox,'MessageBoxA'
Приклад простого застосунку в.COM форматі.
org100hmovah,9hmovdx,helloint21hmovah,8hint21hint20hhellodb13,10,"Hello,World!$"
Приклад простого застосунку вELF форматі.
formatELFexecutable3entrystartsegmentreadableexecutablestart:moveax,4movebx,1movecx,msgmovedx,msg_sizeint0x80moveax,1xorebx,ebxint0x80segmentreadablewriteablemsgdb'Helloworld!',0xAmsg_size=$-msg