FASM

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

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