fladmontør | |
---|---|
| |
Type | compiler |
Udvikler | Tomasz Gryshtar |
Skrevet i | samlesprog |
Operativ system | Unix-lignende styresystem , Microsoft Windows , MS-DOS , DOS , Linux , OpenBSD , MenuetOS og KolibriOS |
Første udgave | 1999 |
nyeste version | 1.73.30 [1] (21. februar 2022 ) |
Genererede filformater | Eksekverbart og linkbart format , COFF og bærbart eksekverbart |
Licens | 2-klausul BSD-licens [2] |
Internet side | flatassembler.net _ |
fasm ( forkortelse for f lat som se m bler) er en gratis multi-pass assembler skrevet af Tomasz Grysztar . fasm er selvstændig [1] , blev oprindeligt kompileret med TASM og har kunnet bygges fra oprindelige kilder siden 4. maj 1999 i version 0.90. fasm er lille i størrelse og har en meget høj kompileringshastighed , har en rig og rummelig makrosyntaks , der giver dig mulighed for at automatisere mange rutineopgaver [3] [4] . Både objektformater og eksekverbare filformater understøttes. Dette eliminerer behovet for en linker i de fleste tilfælde . I andre tilfælde skal du bruge tredjepartslinkere, da en ikke distribueres med fasm.
Ud over det grundlæggende instruktionssæt for processoren og coprocessoren[ hvad? ] , fasm understøtter MMX , SSE , SSE2 , SSE3 , SSSE3 , SSE4.1 , SSE4.2 , SSE4a , AVX , AVX-2 , AVX-512 , 3DNow! , yderligere udvidelser AES , CLMUL , FMA , FMA4 , XOP og EM64T og AMD64 (inklusive AMD SVM og Intel SMX).
Alle varianter af fasm kan direkte oprette outputfiler i følgende formater foruddefineret i assembler: objektfiler (standard for de fleste assemblere): Eksekverbart og linkbart format (ELF) eller Common Object File Format (COFF) (klassisk eller i microsoft-specifikationen), eksekverbare filer (kræver ikke yderligere linkere): MZ , ELF eller Portable Executable (PE) (WDM-drivere inkluderet, med mulighed for at konfigurere MZ DOS-stub). For at generere filer i et andet format end de forudindstillede, er der et binært filformat, der giver programmøren fuld kontrol over hver byte i outputfilen, dog skal programmøren beskrive hele strukturen, indholdet og relationerne af en sådan. fil direkte.
De oprindelige målarkitekturer er IA32- og x86-64-arkitekturer . Der er en uofficiel fasmarm-tilføjelse , der har ARM og ARM64 native target-arkitekturer . Implementeringen af andre målarkitekturer end den oprindelige ligner en lignende implementering i enhver anden assembler - makroer og datadefinitionsdirektiver bruges til disse formål.
At kompilere et program i fasm består af tre faser: forbehandling, parsing og montering.
Det første trin (forbehandling ) udføres i 1 omgang, først tokeniseres kildeteksten, derefter genkendes og behandles alle processordirektiver i den, alle makroer og alle symbolske konstanter udvides. Da der ikke er yderligere beståelser for denne fase, skal ethvert sprogelement, der behandles i denne fase, først deklareres, før det kan bruges.
Det andet trin, på dette trin, finder en yderligere klassificering af tokens sted (fordi selv typerne af tokens og kravene til dem på stadierne af forbehandling og montering er lidt anderledes), for nogle tokens oprettes yderligere egenskabsstrukturer, som vil senere bruges under montering.
På montagestadiet bestemmes etiketadresser , betingede direktiver behandles, løkker åbnes, og det faktiske program genereres. fasm er en multi-pass assembler, som giver den mulighed for at udføre nogle optimeringer (for eksempel generere et kort hop til en etiket i stedet for en lang). Under en beståelse evaluerer compileren muligvis ikke altid udtrykket i betingede direktiver. I dette tilfælde træffer den nogle valg og forsøger at kompilere yderligere. Fordi etiketadresserne beregnet i det N. gennemløb bruges i det N+1. gennemløb, konvergerer denne proces normalt.
Projektet blev startet i 1999 af Tomasz Grysztar ( polsk: Tomasz Grysztar ), som var studerende på det tidspunkt. Dens kildekode blev udelukkende skrevet i TASM assemblersprog . Fra og med version 0.90 (4. maj 1999) blev fasm assembler selvforsynende (dens kildekode blev tilpasset til den oprindelige dialekt og samlet af fasm assembler selv). I marts 2000 blev fasm offentliggjort på internettet.
Oprindeligt kørte fasm kun fra 16-bit flad real-tilstand . 32-bit support blev derefter tilføjet, og derudover DPMI support . Kildekoden er blevet omskrevet, så den nemt kan overføres til ethvert x86-operativsystem, der understøtter 32-bit adressering. Det blev overført til Windows og derefter til Linux.
Fasm har en tendens til at bruge det mindst mulige sæt af præprocessor-direktiver, dvs. i et foruddefineret sæt af direktiver er det ikke tilladt at indføre nye direktiver, hvis funktionalitet kan opnås med et eksisterende sæt af direktiver. Undtagelser er historisk udskiftelige direktiver.
Fasm er en multi-pass assembler med optimistisk forudsigelse, dvs. ved det første gennemløb antager assembleren, at alle instruktioner har deres mindst mulige form. Multi-passering gør det også muligt for udtryk at blive brugt på ubestemt tid, før de erklæres.
Fasm inkluderer ikke erklæringer om ubrugte procedurer i outputfilen (implementeret via makroer).
Indholdet af outputfilen afhænger kun af indholdet af kildekoden og afhænger ikke af operativsystemmiljøet eller af de parametre, der sendes på kommandolinjen. For dem, for hvem dette princip var ubelejligt for win32, blev FA -indpakningen udviklet , som giver dig mulighed for at forbinde en anden fil til filen ikke direkte i koden, men gennem kommandolinjen.
Kildekoden til fasm kan bygges direkte ind i en eksekverbar fil, og omgå faserne med at oprette mellemliggende objektfiler og sammenkæde dem.
Kompilering af kildekoden foregår i flere trin isoleret fra hinanden.
Blokke af outputdata indrammes med de headere, der er nødvendige for formatet, data og headerrelationer behandles, kontrolsummer, blokstørrelser beregnes... En outputfil genereres.
Intel-syntaksen til at skrive instruktioner bruges.
Den eneste væsentlige forskel fra det format, der anvendes i andre assemblere ( MASM , TASM i MASM-kompatibilitetstilstand) er, at værdien af en hukommelsescelle altid skrives som [label_name], men blot label_namebetyder adressen (det vil sige serienummeret) på cellen. Dette giver dig mulighed for at undvære nøgleordet offset. Også i fasm, når man redefinerer størrelsen af en operand, byte ptrskrives den blot i stedet for byte, i stedet for word ptr - osv. Det er wordikke tilladt at bruge flere firkantede parenteser i en operand - derfor skal [bx][si]du skrive i stedet [bx+si]. Disse syntaksændringer resulterede i mere ensartet og lettere at læse kode.
Et eksempel på Windows-program Hej, verden! ”, som udskriver denne besked med en funktion MessageBoxog slutter med:
format pe gui 4 .0 entry start include ' win32a.inc ' start: påkald MessageBox , NULL , besked , besked , MB_OK påkald ExitProcess , 0 besked db ' Hej , verden ! ' , 0 dataimportbibliotek kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' inkluderer ' api / kernel32.inc ' inkluderer ' api / user32.inc ' slutdata _ _ _Eller sådan her:
inkluderer ' win32ax.inc ' .code main: påkald MessageBox , NULL , ' Hello , World ! ' , ' Fasm beskedboks : ' , MB_OK kalder ExitProcess , 0 .end main _En mere kompliceret version med præcisering af afsnit i PE-filen :
format pe gui entry start include ' win32a.inc ' afsnit ' .data ' data læsbar skrivbar besked db ' Hej , verden ! ' , 0 afsnit ' .code ' kode læsbar eksekverbar start: påkald MessageBox , NULL , besked , besked , MB_OK påkald ExitProcess , 0 afsnittet ' .idata ' importer data læsbart skrivbart bibliotek kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' import kernel32 , \ ExitProcess , ' ExitProcess ' importer bruger32 , \ MessageBox , ' MessageBoxA 'Et eksempel på et simpelt 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 , verden ! $ "Et eksempel på et simpelt program i ELF -format .
format ELF eksekverbar 3 indgang start segmentlæsbar eksekverbar _ 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æsbar skrivbar msg db ' Hej verden ! ' , 0xA msg_size = $-msgVed hjælp af direktivet formatkan du angive følgende outputfilformater:
Operativsystemer skrevet i FASM:
Kompilere, der bruger FASM som backend-assembler:
IDE baseret på FASM:
Fasm-syntaksunderstøttelsesfilen leveres med basis- Vim -pakken .
Brugen af fasm understøttes af mange specialiserede IDE'er såsom RadASM , WinAsm Studio , Fresh (specielt designet til fasm) osv.
samlesprog | |
---|---|
IDE | |
Oversættere | |
Syntaksformater _ |