Flat Assembler
Vývojář | Tomasz Grysztar |
---|---|
První vydání | březen 2000 |
Aktuální verze | 1.73.32 (4. prosince 2023) |
Operační systém | DOS and IDE, Windows and IDE, Unix-like (Linux, OpenBSD, etc.), MenuetOS, KolibriOS, OctaOS, DexOS and IDE, SkyOS, Solar_OS |
Vyvíjeno v | jazyk symbolických adres |
Typ softwaru | Překladač |
Licence | Freeware/Open source/BSD |
Web | flatassembler.net |
Některá data mohou pocházet z datové položky. |
Flat Assembler (FASM) je volný a otevřený víceprůchodový assembler, vytvořený Tomaszem Grysztarem. Fasm je napsán na principu stejný zdroj, stejný výstup, disponuje nevelkými rozměry a velmi vysokou rychlostí kompilace. Má bohatou a výstižnou makro–syntaxi dovolující automatizovat množství rutinních úkolů.[1][2] Jsou podporovány jak objektové formáty, tak i formáty spustitelných souborů. To ve většině případů dovoluje se obejít bez linkeru. V ostatních případech je třeba pomocné linkery, protože tyto nejsou rozšiřovány spolu s fasm.
Kromě základního souboru instrukcí procesoru a koprocesoru fasm podporuje soubory instrukcí MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a, AVX a 3DNow!, a také EM64T a AMD64 (včetně AMD SVM a Intel SMX).
Kompilace programu v fasm se skládá ze dvou stadií: předzpracování a sestavování.
Předzpracování
[editovat | editovat zdroj]Ve stadiu předzpracování se otevírají všechna makra, symbolické konstanty, zpracovávají se směrnice předzpracování. Na rozdíl od stadia sestavování se předzpracování provádí pouze jednou. Mísení obou stadií, předzpracování a sestavování, je rozšířená chyba začátečníků.
Sestavování
[editovat | editovat zdroj]Ve stadiu sestavování se specifikuje adresa označení, zpracovávají se dohodnuté pokyny, otevírají se cykly a generuje se přesně program. Fasm je víceprůchodový assembler, který dovoluje vytvářet některé optimalizace, například generování krátkého přechodu na označení místo dlouhého. V době průchodu nemůže kompilátor vždy vyčíslit termíny v předpisech podmínek. V tomto případě dělá nějaký výběr a snaží se kompilovat další. Díky tomu, že adresy označení, vyčíslených na N průchodu se využívají na N+1 průchodu, je tento proces obvykle schůdný.
Formát zápisu instrukcí
[editovat | editovat zdroj]Jsou využívány zápisy pokynů Intel syntax. Jediný existující rozdíl od formátu používaného v jiných assemblerech (MASM, TASM v režimu společně s MASM) je, že význam paměťové buňky se vždy označuje jako [label_name]
a prosté label_name
označuje adresu (to znamená pořadové číslo) paměťové buňky. To dovoluje obejít se bez klíčového slova offset
. Také v fasm se při konkretizaci rozměru operandu namísto byte ptr
se píše jednoduché byte
, namísto word ptr
— word
atd. Není dovoleno používat několik hranatých závorek v jednom operandu, obrazně místo [bx][si]
je nutné psát [bx+si]
. Tyto změny syntaxe přispěly k více uniformnímu a lehce čitelnému kódu.
Příklad programu
[editovat | editovat zdroj]Příklad programu Windows «Hello, world!», který provádí toto spojení s funkcí MessageBox
a následně se ukončí:
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
Nebo také:
include 'win32ax.inc'
.code
main:
invoke MessageBox,NULL,'Hello, World!','Fasm message box:',MB_OK
invoke ExitProcess,0
.end main
Složitější varianta s upřesněním sekcí v PE-souboru:
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'
Příklad jednoduchého programu ve formátu .COM:
org 100h
mov ah,9h
mov dx,hello
int 21h
mov ah,8h
int 21h
int 20h
hello db 13,10,"Hello, World!$"
Příklad jednoduchého programu ve formátu 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
Formát výstupních souborů
[editovat | editovat zdroj]S pomocí příkazu format
lze vytvořit následující formáty výstupní souborů:
MZ
— spustitelné soubory DOS.PE
— spustitelné soubory Windows (konzolní, grafické přílohy a dynamické knihovny).PE64
— spustitelné soubory 64bitových verzí Windows.
COFF
,MS COFF
,MS64 COFF
— objektové soubory.ELF
,ELF64
— spustitelné soubory v UN*X.ARM
— rozpracováno nadšenci, lze najít na oficiálním fóru.Binary
— soubory volné struktury. Při uvedení 100h (org 100h
), ) lze obdržet výkonný soubor formátu .COM. Takže s pomocíformat binary
lze kompilovat soubory údajů.[3]
Podporované operační systémy
[editovat | editovat zdroj]- DOS
- Windows: NT, XP, Vista, 7
- Založené na Linux — přímo, přes systémové vyvolání
- FreeBSD
- Ostatní, založené na libc (UN*X)
- MenuetOS, KolibriOS — nedodává se ve standardním kompletu fasm, dodává se spolu s těmito operačními systémy
Podpora fasm ve vedlejších programových produktech
[editovat | editovat zdroj]Definiční soubor podporující zvýraznění syntaxe fasm se dodává spolu se základním kompletem Vim. Využití fasm podporují mnohé specializované IDE, například RadASM, WinAsm Studio, Fresh (speciálně projektovaný pod fasm) atd.
Poznámky
[editovat | editovat zdroj]- ↑ Tomasz Grysztar. Flat Assembler Programmer's Manual [online]. [cit. 2008-05-12]. Dostupné online.
- ↑ Randall Hyde. Which Assembler is the Best? [online]. [cit. 2008-05-18]. Dostupné v archivu pořízeném dne 2007-10-18.
- ↑ 3.Téma na oficiálním fóru o tvorbě zobrazení pomocí makro – fasm
Reference
[editovat | editovat zdroj]- Oficiální stránka - anglicky
- FASMARM – FASM for ARM processors, v1.24
- FASMLIB 0.8.0 – portable 32-bit x86 asm lib for FASM/MASM/YASM/NASM/GASM
- JaeEditor 1.0 (FASM IDE)