Flat Assembler

Z Wikipedie, otevřené encyklopedie
FASM
VývojářTomasz Grysztar
První vydáníbřezen 2000
Aktuální verze1.73.30 (21. února 2022)
Operační systémDOS and IDE, Windows and IDE, Unix-like (Linux, OpenBSD, etc.), MenuetOS, KolibriOS, OctaOS, DexOS and IDE, SkyOS, Solar_OS
Vyvíjeno vjazyk symbolických adres
Typ softwaruPřekladač
LicenceFreeware/Open source/BSD
Webflatassembler.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 ptrword 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).
  • 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]

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]

  1. Tomasz Grysztar. Flat Assembler Programmer's Manual [online]. [cit. 2008-05-12]. Dostupné online. 
  2. Randall Hyde. Which Assembler is the Best? [online]. [cit. 2008-05-18]. Dostupné v archivu pořízeném dne 2007-10-18. 
  3. 3.Téma na oficiálním fóru o tvorbě zobrazení pomocí makro – fasm

Reference[editovat | editovat zdroj]