platt montör | |
---|---|
| |
Sorts | kompilator |
Utvecklaren | Tomasz Gryshtar |
Skrivet i | assembleringsspråk |
Operativ system | Unix-liknande operativsystem , Microsoft Windows , MS-DOS , DOS , Linux , OpenBSD , MenuetOS och KolibriOS |
Första upplagan | 1999 |
senaste versionen | 1.73.30 [1] (21 februari 2022 ) |
Genererade filformat | Körbart och länkbart format , COFF och bärbart körbart |
Licens | 2-klausul BSD-licens [2] |
Hemsida | flatassembler.net _ |
fasm ( förkortning för f lat som se m bler) är en gratis multi-pass assembler skriven av Tomasz Grysztar . fasm är fristående [1] , kompilerades ursprungligen med TASM och har kunnat byggas från inhemska källor sedan 4 maj 1999 i version 0.90. fasm är liten i storleken och har en mycket hög kompileringshastighet , har en rik och rymlig makrosyntax som låter dig automatisera många rutinuppgifter [3] [4] . Både objektformat och körbara filformat stöds. Detta eliminerar behovet av en länk i de flesta fall . I andra fall måste du använda länkar från tredje part, eftersom en inte distribueras med fasm.
Förutom den grundläggande instruktionsuppsättningen för processorn och samprocessorn[ vad? ] , fasm stöder MMX , SSE , SSE2 , SSE3 , SSSE3 , SSE4.1 , SSE4.2 , SSE4a , AVX , AVX-2 , AVX-512 , 3DNow! , ytterligare tillägg AES , CLMUL , FMA , FMA4 , XOP och EM64T och AMD64 (inklusive AMD SVM och Intel SMX).
Alla varianter av fasm kan direkt skapa utdatafiler i följande format fördefinierade i assembler: objektfiler (standard för de flesta assemblerare): Executable and Linkable Format (ELF) eller Common Object File Format (COFF) (klassiskt eller i microsoft-specifikationen), körbara filer (kräver inga ytterligare länkar): MZ , ELF eller Portable Executable (PE) (WDM-drivrutiner ingår, med möjlighet att konfigurera MZ DOS-stub). För att generera filer i ett annat format än de förinställda finns det ett binärt filformat som ger programmeraren full kontroll över varje byte i utdatafilen, men programmeraren måste beskriva hela strukturen, innehållet och relationerna för en sådan. fil direkt.
De ursprungliga målarkitekturerna är IA32- och x86-64-arkitekturer . Det finns ett inofficiellt fasmarm-tillägg som har ARM- och ARM64 -målarkitekturer . Implementeringen av andra målarkitekturer än den ursprungliga liknar en liknande implementering i någon annan assembler - makron och datadefinitionsdirektiv används för dessa ändamål.
Att kompilera ett program i fasm består av tre steg: förbearbetning, parsning och montering.
Det första steget (förbearbetning ) utförs i 1 pass, först tokeniseras källtexten, sedan identifieras och bearbetas alla processordirektiv i den, alla makron och alla symboliska konstanter expanderas. Eftersom det inte finns några ytterligare pass för detta steg måste alla språkelement som bearbetas i detta steg först deklareras innan det kan användas.
Det andra steget, i detta skede, sker en ytterligare klassificering av tokens (eftersom även typerna av tokens och kraven på dem i stadierna av förbearbetning och montering är något annorlunda), för vissa tokens skapas ytterligare egenskapsstrukturer, vilket kommer att senare användas vid montering.
Vid monteringsstadiet bestäms etikettadresser , villkorliga direktiv bearbetas, slingor öppnas och det faktiska programmet genereras. fasm är en multi-pass assembler, som gör att den kan göra vissa optimeringar (till exempel generera ett kort hopp till en etikett istället för en lång). Under ett pass kanske kompilatorn inte alltid utvärderar uttrycket i villkorliga direktiv. I det här fallet gör den ett val och försöker kompilera ytterligare. Eftersom etikettadresserna som beräknas i det N:e passet används i det N+1:a passet, konvergerar denna process vanligtvis.
Projektet startades 1999 av Tomasz Grysztar ( polska: Tomasz Grysztar ), som då var student. Dess källkod skrevs helt och hållet i TASM assemblerspråk . Från och med version 0.90 (4 maj 1999) blev fasm assembler självförsörjande (dess källkod anpassades till den inhemska dialekten och sattes ihop av fasm assembler själv). I mars 2000 publicerades fasm på Internet.
Till en början körde fasm bara från 16-bitars platt real-läge . 32-bitarsstöd lades sedan till, och utöver det DPMI- stöd . Källkoden har skrivits om så att den enkelt kan portas till valfritt x86-operativsystem som stöder 32-bitars adressering. Det portades till Windows och sedan till Linux.
Fasm tenderar att använda den minsta möjliga uppsättningen av förprocessordirektiv, dvs. i en fördefinierad uppsättning direktiv är det inte tillåtet att införa nya direktiv, vars funktionalitet kan uppnås genom en befintlig uppsättning direktiv. Undantag är historiskt utbytbara direktiv.
Fasm är en multi-pass assembler med optimistisk förutsägelse, d.v.s. vid första passet antar montören att alla instruktioner tar sin minsta möjliga form. Multi-passering tillåter också att uttryck används på obestämd tid innan de deklareras.
Fasm inkluderar inte deklarationer av oanvända procedurer i utdatafilen (implementerad via makron).
Innehållet i utdatafilen beror endast på innehållet i källkoden och beror inte på operativsystemets miljö eller på parametrarna som skickas på kommandoraden. För dem för vilka denna princip var obekväm för win32, utvecklades FA -omslaget , som låter dig ansluta en annan fil till filen inte direkt i koden, utan via kommandoraden.
Källkoden för fasm kan byggas in direkt i en körbar fil, förbi stegen för att skapa mellanliggande objektfiler och länka dem.
Sammanställning av källkoden sker i flera steg isolerade från varandra.
Block av utdata ramas in med de rubriker som krävs för formatet, data och rubrikrelationer bearbetas, kontrollsummor, blockstorlekar beräknas... En utdatafil genereras.
Intel -syntaxen för att skriva instruktioner används.
Den enda signifikanta skillnaden från formatet som används i andra assemblers ( MASM , TASM i MASM-kompatibilitetsläge) är att värdet på en minnescell alltid skrivs som [label_name], men betyder helt label_nameenkelt adressen (det vill säga serienumret) för cellen. Detta gör att du klarar dig utan nyckelordet offset. Även i fasm, när du omdefinierar storleken på en operand, byte ptrskrivs den helt enkelt istället för byte, istället för word ptr - , etc. Det är wordinte tillåtet att använda flera hakparenteser i en operand - alltså [bx][si]måste du skriva istället [bx+si]. Dessa syntaxändringar resulterade i mer enhetlig och lättare att läsa kod.
Ett exempel på Windows-program Hej världen! ”, som skriver ut detta meddelande med en funktion MessageBoxoch slutar med:
format pe gui 4 .0 entry start include ' win32a.inc ' start: anropa MessageBox , NULL , meddelande , meddelande , MB_OK anropa ExitProcess , 0 meddelande db ' Hej världen ! _ ' , 0 dataimportbibliotek kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' inkluderar ' api / kernel32.inc ' inkluderar ' api / user32.inc ' slutdata _ _ _Eller så här:
inkludera ' win32ax.inc ' .code main: anropa MessageBox , NULL , ' Hello , World ! ' , ' Fasm meddelanderuta : ' , MB_OK anropa ExitProcess , 0 .end main _En mer komplicerad version, med förtydligande av avsnitten i PE-filen :
format pe gui inträde start inkluderar ' win32a.inc ' avsnitt ' .data ' data läsbar skrivbar meddelande db ' Hej världen ! _ ' , 0 avsnitt ' .code ' kod läsbar körbar start: anropa MessageBox , NULL , meddelande , meddelande , MB_OK anropa ExitProcess , 0 avsnitt ' .idata ' importera data läsbart skrivbart bibliotek kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' import kernel32 , \ ExitProcess , ' ExitProcess ' import user32 , \ MessageBox , ' MessageBoxA 'Ett exempel på ett enkelt konsolprogram i .COM- format :
org 100h _ mov ah , 9 h mov dx , hej int 21 h mov ah , 8 h int 21 h int 20 h hej db 13 , 10 , " Hej världen ! $ " _Ett exempel på ett enkelt program i ELF -format .
format ELF körbar 3 start start segmentläsbar körbar _ start: mov eax , 4 mov ebx , 1 mov ecx , msg mov edx , msg_size int 0x80 mov eax , 1xor ebx , ebx int 0x80 _ segment läsbart skrivbart msg db ' Hej världen ! ' , 0xA msg_size = $-msgMed hjälp av direktivet formatkan du ange följande utdatafilformat:
Operativsystem skrivna i FASM:
Kompilatorer som använder FASM som backend assembler:
IDE baserad på FASM:
Fasm-syntaxstödfilen kommer med baspaketet Vim .
Användningen av fasm stöds av många specialiserade IDE :er som RadASM , WinAsm Studio , Fresh (speciellt designad för fasm), etc.
assembleringsspråk | |
---|---|
ID | |
Översättare | |
Syntaxformat _ |