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).

Історія Проєкт розпочав у 1999 році польський студент математики Томаш Гриштар. Перший публічний випуск був представлений 15 березня 2000 року. FASM сам повністю написаний на асемблері і йде із повним початковим кодом. З версії 0.90 FASM може скомпілювати свій власний код. Він використовувався для написання декількох операційних систем, включаючи MenuetOS та DexOS.

Архітектура Приклади Приклад Windows-програми «Hello, world!», яка викликає повідомлення за допомогою функції MessageBox: format pe gui 4.0 entry start include 'win32a.inc'

start: invoke MessageBox,NULL,message,message,MB_OK invoke ExitProcess,0

message db 'Hello, World!',0

data import library kernel32,'kernel32.dll',\ user32,'user32.dll' include 'api/kernel32.inc' include 'api/user32.inc' end data Або так: include 'win32ax.inc' .code main: invoke MessageBox,NULL,'Hello, World!','Fasm message box:',MB_OK invoke ExitProcess,0 .end main Трохи складніша версія, з визначенням секцій в PE-файлі: format pe gui entry start include 'win32a.inc'

section '.data' data readable writeable

message db 'Hello, World!',0

section '.code' code readable executable

start: invoke MessageBox,NULL,message,message,MB_OK invoke ExitProcess,0

section '.idata' import data readable writeable library kernel32,'kernel32.dll',\ user32,'user32.dll' import kernel32,\ ExitProcess,'ExitProcess' import user32,\ MessageBox,'MessageBoxA' Приклад простого застосунку в .COM форматі. org 100h

mov ah,9h mov dx,hello int 21h mov ah,8h int 21h int 20h

hello db 13,10,"Hello, World!$"

Приклад простого застосунку в ELF форматі. format ELF executable 3 entry start

segment readable executable

start: mov eax,4 mov ebx,1 mov ecx, msg mov edx, msg_size int 0x80

mov eax,1 xor ebx, ebx int 0x80

segment readable writeable

msg db 'Hello world!',0xA msg_size = $-msg

Див. також Мова асемблера MASM

Примітки