plochý montážník | |
---|---|
| |
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 ) |
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 programu ve fasm se skládá ze tří fází: předběžného zpracování, analýzy a sestavení.
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.
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.
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.
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.
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í.
Kompilace zdrojového kódu probíhá v několika fázích izolovaných od sebe.
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.
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 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á dataNebo takhle:
include ' win32ax.inc ' .code main: invoke MessageBox , NULL , ' Hello , World ! ' , ' Fasm message box : ' , MB_OK invoke ExitProcess , 0 .end mainSlož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 = $-msgPomocí direktivy formatmůžete určit následující formáty výstupních souborů:
Operační systémy napsané v FASM:
Kompilátory používající FASM jako backend assembler:
IDE založené na FASM:
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.
jazyk symbolických instrukcí | |
---|---|
IDE | |
Překladatelé | |
Formáty syntaxe |