FASM

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Flat assembler
FASM.PNG
Розробник(и) Томаш Гриштар
Стабільний випуск 1.70.03 (29 червня 2012)
Операційна система DOS, DexOS, Win32, Linux, BSD, MenuetOS, KolibriOS
Тип асемблер
Ліцензія Ліцензія BSD
Сайт 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).

Історія[ред.ред. код]

Проект розпочав у 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

Див. також[ред.ред. код]