Snabb

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 10 september 2022; kontroller kräver 10 redigeringar .

platt montör

Skärmdump av FASM med kod från de medföljande exemplen
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 ) ( 2022-02-21 )
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.

Sammanställning

Att kompilera ett program i fasm består av tre steg: förbearbetning, parsning och montering.

Förbearbetning

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.

Parsing

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.

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.

Historik

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.

Principer

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.

Kompileringsprocess

Sammanställning av källkoden sker i flera steg isolerade från varandra.

Konvertera utdata till det begärda formatet

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.

Instruktionsformat

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.

Programexempel

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 = $-msg

Utdatafilformat

Med hjälp av direktivet formatkan du ange följande utdatafilformat:

  • MZ- DOS  körbara filer .
  • PE- Windows  körbara filer (konsol, grafiska applikationer och dynamiska bibliotek).
    • PE64 - körbara filer av 64-bitarsversioner av Windows.
  • COFF, MS COFF, MS64 COFF är objektfiler.
  • ELF, ELF64 är körbara filer på Unix-liknande system .
  • ARM — Utveckling av entusiaster [5] .
  • Binary - filer med godtycklig struktur. Om du anger en offset på 100h ( ) skapas en org 100hkörbar fil i .COM - format . Du format binarykan också kompilera datafiler med [6] .

Operativsystem

Applikation

Operativsystem skrivna i FASM:

  • DexOS av Ville Turijanmaa
  • MenuetOS - 32-bitars och 64-bitars grafiska operativsystem av Ville Turijanmaa
  • KolibriOS - en gaffel av MenuetOS

Kompilatorer som använder FASM som backend assembler:

IDE baserad på FASM:

  • Fresh är ett gemenskapsstödt projekt grundat av John Found

Stöd för fasm i programvara från tredje part

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.

Anteckningar

  1. 1 2 Nedladdning av platt assembler  . flatassembler.net . Hämtad 26 augusti 2019. Arkiverad från originalet 31 augusti 2019.
  2. https://github.com/tgrysztar/fasm/blob/752cc50465e38a98a2b6ed1161983988e4d5f61a/LICENSE.TXT
  3. Tomasz Grysztar. Flat Assembler Programmer's Manual  (engelska)  (nedlänk) . Hämtad 27 maj 2012. Arkiverad från originalet 31 maj 2012.
  4. Randall Hyde. Vilken assembler är bäst?  (engelska)  (otillgänglig länk) . Hämtad 27 maj 2012. Arkiverad från originalet 31 maj 2012.
  5. FASM ARM  . flatassembler.net .
  6. Officiell forumtråd om att skapa bilder med fasm-  makron . Hämtad 26 augusti 2019. Arkiverad från originalet 4 augusti 2020.

Länkar