FASM
FASM (flat assembler) — асемблер, для архітектур IA-32 та x86-64, використовує синтаксис Інтел. Відомий своєю швидкістю компіляції, оптимізацією розміру скомпільованого коду, портованістю на різні ОС та широкими можливостями препроцесора (макросами), що дозволяє автоматизувати безліч рутинних завдань. Він є низькорівневим асемблером та навмисно має лише невелику кількість опцій командного рядка. FASM є вільним та відкритим програмним забезпеченням.
| |
Тип | асемблер |
---|---|
Розробник | Томаш Гриштар |
Стабільний випуск | 1.71.17 (29 січня 2014) |
Версії | 1.73.29 (18 грудня 2021)[1] |
Репозиторій | github.com/tgrysztar/fasm |
Операційна система | DOS, DexOS, Win32, Linux, BSD, MenuetOS, KolibriOS |
Мова програмування | асемблер |
Ліцензія | Ліцензія BSD |
Онлайн-документація | flatassembler.net/docs.php?article=manual(англ.) |
Вебсайт |
flatassembler.net |
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:
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
Див. також
Примітки
- http://flatassembler.net/download.php — 2021.
- Жуковський, В.; Жуковська, Н.; Власюк, А.; Сафонюк, А. (24 жовтня 2019). Method of Forensic Analysis for Compromising Carrier-lock Algorithm on 3G Modem Firmware (англ.). IEEE. doi:10.1109/UKRCON.2019.8879941.