Rychle

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 10. září 2022; kontroly vyžadují 10 úprav .

plochý montážník

Snímek obrazovky FASM s kódem z dodaných příkladů
Typ kompilátor
Vývojář Tomáš Gryshtar
Zapsáno v jazyk symbolických instrukcí
Operační systém Operační systém podobný Unixu , Microsoft Windows , MS-DOS , DOS , Linux , OpenBSD , MenuetOS a KolibriOS
První vydání 1999
Nejnovější verze 1.73.30 [1] (21. února 2022 ) ( 2022-02-21 )
Vygenerované formáty souborů Spustitelný a propojitelný formát , COFF a přenosný spustitelný soubor
Licence 2-klauzule BSD licence [2]
webová stránka flatassembler.net

fasm ( zkratka pro plochý jako se m bller ) je bezplatný víceprůchodový assembler napsaný Tomaszem Grysztarem . fasm je soběstačný [1] , byl původně zkompilován s TASM a od 4. května 1999 jej lze sestavit z nativních zdrojů ve verzi 0.90. fasm má malou velikost a má velmi vysokou rychlost kompilace , má bohatou a prostornou syntaxi maker , která vám umožňuje automatizovat mnoho rutinních úloh [3] [4] . Podporovány jsou jak formáty objektů, tak formáty spustitelných souborů. To ve většině případů eliminuje potřebu linkeru . V ostatních případech musíte použít linkery třetích stran, protože jeden není distribuován s fasm.

Kromě základní instrukční sady procesoru a koprocesoru[ co? ] , fasm podporuje MMX , SSE , SSE2 , SSE3 , SSSE3 , SSE4.1 , SSE4.2 , SSE4a , AVX , AVX-2 , AVX-512 , 3DNow! , další rozšíření AES , CLMUL , FMA , FMA4 , XOP a EM64T a AMD64 (včetně AMD SVM a Intel SMX).

Všechny varianty fasm mohou přímo vytvářet výstupní soubory v následujících formátech předdefinovaných v assembleru: objektové soubory (standardní pro většinu assemblerů): Executable and Linkable Format (ELF) nebo Common Object File Format (COFF) (klasický nebo ve specifikaci microsoftu), spustitelné soubory (nevyžaduje další linkery): MZ , ELF nebo Portable Executable (PE) (včetně ovladačů WDM, s možností konfigurace MZ DOS stub). Pro generování souborů v jiném než přednastaveném formátu existuje binární formát souboru, který dává programátorovi plnou kontrolu nad každým byte výstupního souboru, nicméně programátor bude muset popsat celou strukturu, obsah a vztahy takového souboru. soubor přímo.

Nativní cílové architektury jsou architektury IA32 a x86-64 . Existuje neoficiální doplněk fasmarm , který má nativní cílové architektury ARM a ARM64 . Implementace cílových architektur jiných než nativní je podobná podobné implementaci v jakémkoli jiném assembleru – pro tyto účely se používají makra a direktivy pro definici dat.

Kompilace

Kompilace programu ve fasm se skládá ze tří fází: předběžného zpracování, analýzy a sestavení.

Předzpracování

První fáze (preprocessing ) se provádí v 1 průchodu, nejprve je tokenizován zdrojový text, poté jsou v něm rozpoznány a zpracovány všechny direktivy procesoru, rozbalena všechna makra a všechny symbolické konstanty. Protože pro tuto fázi neexistují žádné další průchody, musí být každý jazykový prvek zpracovaný v této fázi nejprve deklarován, než bude možné jej použít.

Analýza

Druhá fáze, v této fázi, dochází k dodatečné klasifikaci tokenů (protože i typy tokenů a požadavky na ně ve fázích předběžného zpracování a montáže jsou mírně odlišné), pro některé tokeny jsou vytvořeny další struktury vlastností, které později použít při montáži.

Montáž

Ve fázi sestavení se určí adresy štítků , zpracují se podmíněné příkazy, otevřou se smyčky a vygeneruje se skutečný program. fasm je víceprůchodový assembler, který mu umožňuje provádět určité optimalizace (například generovat krátký skok na štítek místo dlouhého). Během průchodu kompilátor nemusí vždy vyhodnotit výraz v podmíněných direktivách. V tomto případě provede určitou volbu a pokusí se kompilovat dále. Protože se adresy návěští vypočítané v N-tém průchodu používají v N+1. průchodu, tento proces obvykle konverguje.

Historie

Projekt zahájil v roce 1999 Tomasz Grysztar ( polsky Tomasz Grysztar ), který byl v té době studentem. Jeho zdrojový kód byl napsán výhradně v jazyce symbolických instrukcí TASM . Počínaje verzí 0.90 (4. května 1999) se fasm assembler stal soběstačným (jeho zdrojový kód byl přizpůsoben nativnímu dialektu a sestaven samotným fasm assemblerem). V březnu 2000 byl na internetu zveřejněn fasm.

Zpočátku fasm běžel pouze z 16bitového plochého reálného režimu . Poté byla přidána podpora 32 bitů a navíc podpora DPMI . Zdrojový kód byl přepsán tak, aby jej bylo možné snadno přenést na jakýkoli operační systém x86, který podporuje 32bitové adresování. Byl portován na Windows a poté na Linux.

Principy

Fasm má tendenci používat co nejmenší sadu direktiv preprocesoru, tzn. v předem definovaném souboru směrnic není dovoleno zavádět nové směrnice, jejichž funkčnosti lze dosáhnout již existujícím souborem směrnic. Výjimkou jsou historicky zaměnitelné směrnice.

Fasm je víceprůchodový assembler s optimistickou predikcí, tzn. při prvním průchodu assembler předpokládá, že všechny instrukce mají nejmenší možnou formu. Vícenásobné předávání také umožňuje používat výrazy po neomezenou dobu před tím, než jsou deklarovány.

Fasm nezahrnuje deklarace nepoužitých procedur do výstupního souboru (implementované přes makra).

Obsah výstupního souboru závisí pouze na obsahu zdrojového kódu a nezávisí na prostředí operačního systému ani na parametrech předávaných na příkazovém řádku. Pro ty, kterým byl tento princip pro win32 nepohodlný, byl vyvinut FA wrapper , který umožňuje připojit další soubor k souboru ne přímo v kódu, ale přes příkazový řádek.

Zdrojový kód pro fasm lze zabudovat přímo do spustitelného souboru, čímž se obejdou fáze vytváření souborů mezilehlých objektů a jejich propojení.

Proces kompilace

Kompilace zdrojového kódu probíhá v několika fázích izolovaných od sebe.

Konverze výstupu do požadovaného formátu

Bloky výstupních dat jsou orámovány hlavičkami nezbytnými pro formát, zpracovávají se data a vztahy hlaviček, počítají se kontrolní součty, velikosti bloků... Vygeneruje se výstupní soubor.

Formát instrukce

Pro zápis instrukcí je použita syntaxe Intel .

Jediný významný rozdíl od formátu přijatého v jiných assemblerech ( MASM , TASM v režimu kompatibility MASM) je v tom, že hodnota paměťové buňky je vždy zapsána jako [label_name], ale jednoduše label_nameznamená adresu (tj. sériové číslo) buňky. To vám umožní obejít se bez klíčového slova offset. Také ve fasm se při předefinování velikosti operandu byte ptrjednoduše zapíše místo byte, místo word ptr - atd. wordNení povoleno používat několik hranatých závorek v jednom operandu - proto [bx][si]musíte místo toho napsat [bx+si]. Tyto změny syntaxe vedly k jednotnějšímu a snadněji čitelnému kódu.

Příklad programu

Příklad programu Windows Hello, world! “, která vytiskne tuto zprávu s funkcí MessageBoxa končí:

formát pe gui 4 .0 vstup start obsahovat ' win32a.inc ' start: invoke MessageBox , NULL , message , message , MB_OK invoke ExitProcess , 0 zpráva db ' Hello , World ! ' , 0 knihovna pro import dat kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' include ' api / kernel32.inc ' include ' api / user32.inc ' koncová data

Nebo takhle:

include ' win32ax.inc ' .code main: invoke MessageBox , NULL , ' Hello , World ! ' , ' Fasm message box : ' , MB_OK invoke ExitProcess , 0 .end main

Složitější verze s objasněním sekcí v souboru PE :

formát pe gui vstup start obsahovat ' win32a.inc ' sekce ' .data ' data čitelná a zapisovatelná zpráva db ' Hello , World ! ' , 0 sekce ' .code ' kód čitelný spustitelný soubor start: invoke MessageBox , NULL , message , message , MB_OK invoke ExitProcess , 0 sekce ' .idata ' import dat čitelná zapisovatelná knihovna kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' import kernel32 , \ ExitProcess , ' ExitProcess ' import user32 , \ MessageBox , ' MessageBoxA '

Příklad jednoduchého konzolového programu ve formátu .COM :

org 100h _ mov ah , 9 h mov dx , ahoj int 21 h mov ah , 8 h int 21 h int 20 h ahoj db 13 , 10 , " Ahoj světe ! $ " _

Příklad jednoduchého programu ve formátu ELF .

formát ELF spustitelný 3 vstup start segment čitelný spustitelný soubor začátek: mov eax , 4 mov ebx , 1 mov ecx , msg mov edx , msg_size int 0x80 mov eax , 1xor ebx , ebx int 0x80 _ segment čitelný zapisovatelný msg db ' Ahoj světe ! ' , 0xA msg_size = $-msg

Formát výstupního souboru

Pomocí direktivy formatmůžete určit následující formáty výstupních souborů:

  • MZ - Spustitelné soubory DOSu .
  • PE - Spustitelné soubory Windows (konzole, grafické aplikace a dynamické knihovny).
    • PE64 - spustitelné soubory 64bitových verzí systému Windows.
  • COFF, MS COFF, MS64 COFF jsou objektové soubory.
  • ELF, ELF64 jsou spustitelné soubory na systémech podobných Unixu .
  • ARM — rozvoj nadšenců [5] .
  • Binary - soubory libovolné struktury. Zadáním offsetu 100h ( ) vznikne org 100hspustitelný soubor ve formátu .COM . Datové soubory format binarymůžete také kompilovat pomocí [6] .

Operační systémy

Aplikace

Operační systémy napsané v FASM:

  • DexOS od Ville Turijanmaa
  • MenuetOS - 32bitové a 64bitové grafické operační systémy od Ville Turijanmaa
  • KolibriOS - fork MenuetOS

Kompilátory používající FASM jako backend assembler:

IDE založené na FASM:

  • Fresh je komunitou podporovaný projekt založený Johnem Foundem

Podpora pro fasm v softwaru třetích stran

Soubor podpory syntaxe fasm je dodáván se základním balíčkem Vim .

Použití fasm je podporováno mnoha specializovanými IDE jako RadASM , WinAsm Studio , Fresh (speciálně navržený pro fasm) atd.

Poznámky

  1. 1 2 Stažení plochého assembleru  . flatassembler.net . Získáno 26. srpna 2019. Archivováno z originálu dne 31. srpna 2019.
  2. https://github.com/tgrysztar/fasm/blob/752cc50465e38a98a2b6ed1161983988e4d5f61a/LICENSE.TXT
  3. Tomáš Grysztar. Flat Assembler Programmer's Manual  (anglicky)  (downlink) . Získáno 27. května 2012. Archivováno z originálu 31. května 2012.
  4. Randall Hyde. Který assembler je nejlepší?  (anglicky)  (nedostupný odkaz) . Získáno 27. května 2012. Archivováno z originálu 31. května 2012.
  5. FASM ARM  . flatassembler.net .
  6. ↑ Oficiální vlákno fóra o vytváření obrázků pomocí maker fasm  . Získáno 26. srpna 2019. Archivováno z originálu dne 4. srpna 2020.

Odkazy