tasainen kokoaja | |
---|---|
Kuvakaappaus FASM:sta mukana toimitettujen esimerkkien koodilla | |
Tyyppi | kääntäjä |
Kehittäjä | Tomasz Gryshtar |
Sisään kirjoitettu | kokoonpanokieli |
Käyttöjärjestelmä | Unix-tyyppinen käyttöjärjestelmä , Microsoft Windows , MS-DOS , DOS , Linux , OpenBSD , MenuetOS ja KolibriOS |
Ensimmäinen painos | 1999 |
uusin versio | 1.73.30 [1] (21. helmikuuta 2022 ) |
Luodut tiedostomuodot | Suoritettava ja linkitettävä muoto , COFF ja kannettava suoritettava |
Lisenssi | 2 lausekkeen BSD-lisenssi [2] |
Verkkosivusto | flatassembler.net _ |
fasm ( lyhenne sanoista flat as se m bler ) on ilmainen monivaiheinen kokoonpano , jonka on kirjoittanut Tomasz Grysztar . fasm on itsenäinen [1] , käännettiin alun perin TASM :n kanssa ja se on pystytty rakentamaan alkuperäisistä lähteistä 4. toukokuuta 1999 lähtien versiossa 0.90. fasm on kooltaan pieni ja sillä on erittäin korkea käännösnopeus , siinä on rikas ja tilava makrosyntaksi , jonka avulla voit automatisoida monia rutiinitehtäviä [3] [4] . Sekä objektimuotoja että suoritettavia tiedostomuotoja tuetaan. Tämä eliminoi linkkerin tarpeen useimmissa tapauksissa . Muissa tapauksissa sinun on käytettävä kolmannen osapuolen linkittäjiä, koska niitä ei jaeta fasmin kanssa.
Prosessorin ja apuprosessorin peruskäskysarjan lisäksi[ mitä? ] , fasm tukee MMX , SSE , SSE2 , SSE3 , SSSE3 , SSE4.1 , SSE4.2 , SSE4a , AVX , AVX-2 , AVX-512 , 3DNow! , lisälaajennukset AES , CLMUL , FMA , FMA4 , XOP ja EM64T ja AMD64 (mukaan lukien AMD SVM ja Intel SMX).
Kaikki fasmin muunnelmat voivat luoda suoraan tulostiedostoja seuraavissa muodoissa, jotka on määritetty valmiiksi assemblerissä: objektitiedostot (vakio useimmille assemblereille): suoritettava ja linkitettävä muoto (ELF) tai yhteinen objektitiedostomuoto (COFF) (klassinen tai Microsoftin määrittelyssä), suoritettavat tiedostot (ei vaadi lisälinkkejä): MZ , ELF tai Portable Executable (PE) (WDM-ohjaimet mukana, mahdollisuus määrittää MZ DOS stub). Jos haluat luoda tiedostoja muussa kuin esiasetetun muodossa, on olemassa binääritiedostomuoto, joka antaa ohjelmoijalle täyden hallinnan tulostiedoston jokaisesta tavusta, mutta ohjelmoijan on kuvattava tällaisen tiedoston koko rakenne, sisältö ja suhteet. tiedosto suoraan.
Alkuperäiset kohdearkkitehtuurit ovat IA32- ja x86-64-arkkitehtuurit . On epävirallinen fasmarm-lisäosa , jossa on alkuperäiset ARM- ja ARM64-kohdearkkitehtuurit . Muiden kuin alkuperäisen kohdearkkitehtuurien toteutus on samanlainen kuin samanlainen toteutus missä tahansa muussa assemblerissä - makroja ja datamäärittelydirektiivejä käytetään näihin tarkoituksiin.
Ohjelman kääntäminen fasmissa koostuu kolmesta vaiheesta: esikäsittelystä, jäsentämisestä ja kokoonpanosta.
Ensimmäinen vaihe (esikäsittely ) suoritetaan yhdellä kertaa, ensin lähdeteksti tokenisoidaan, sitten kaikki prosessorin direktiivit tunnistetaan ja käsitellään siinä, kaikki makrot ja kaikki symboliset vakiot laajennetaan. Koska tässä vaiheessa ei ole ylimääräisiä läpäisyjä, kaikki tässä vaiheessa käsitellyt kielielementit on ensin ilmoitettava ennen kuin niitä voidaan käyttää.
Toisessa vaiheessa, tässä vaiheessa, tapahtuu tokenien lisäluokitus (koska jopa tokenien tyypit ja niille asetetut vaatimukset esikäsittely- ja kokoonpanovaiheissa ovat hieman erilaiset), joillekin tokeneille luodaan lisäominaisuusrakenteita, jotka käyttää myöhemmin asennuksen aikana.
Kokoonpanovaiheessa määritetään tarraosoitteet , käsitellään ehdolliset käskyt, avataan silmukat ja luodaan varsinainen ohjelma. fasm on monivaiheinen kokoaja, jonka avulla se voi tehdä joitain optimointeja (esimerkiksi luoda lyhyen hypyn etikettiin pitkän hypyn sijaan). Siirron aikana kääntäjä ei välttämättä aina arvioi lauseketta ehdollisissa direktiiveissä. Tässä tapauksessa se tekee jonkin valinnan ja yrittää kääntää lisää. Koska N:nnessä kierrossa laskettuja tarraosoitteita käytetään N+1:ssä, tämä prosessi yleensä konvergoi.
Projektin aloitti vuonna 1999 Tomasz Grysztar ( puola: Tomasz Grysztar ), joka oli silloin opiskelija. Sen lähdekoodi on kirjoitettu kokonaan TASM- kokoonpanokielellä . Alkaen versiosta 0.90 (4. toukokuuta 1999), fasm assembleristä tuli omavarainen (sen lähdekoodi mukautettiin äidinkieleen ja fasm assembler itse kokosi). Maaliskuussa 2000 fasm julkaistiin Internetissä.
Aluksi fasm toimi vain 16-bittisessä litteässä reaalitilassa . Sitten lisättiin 32-bittinen tuki ja sen lisäksi DPMI- tuki . Lähdekoodi on kirjoitettu uudelleen niin, että se voidaan helposti siirtää mihin tahansa x86-käyttöjärjestelmään, joka tukee 32-bittistä osoitusta. Se siirrettiin Windowsiin ja sitten Linuxiin.
Fasm pyrkii käyttämään pienintä mahdollista esikäsittelyohjeiden joukkoa, ts. ennalta määrätyssä direktiivijoukossa ei saa ottaa käyttöön uusia direktiivejä, joiden toiminnallisuus voidaan saavuttaa olemassa olevilla direktiiveillä. Poikkeuksia ovat historiallisesti keskenään vaihdettavat direktiivit.
Fasm on monivaiheinen kokoaja, jolla on optimistinen ennuste, ts. ensimmäisellä kerralla kokoaja olettaa, että kaikki ohjeet ovat pienimmässä mahdollisessa muodossaan. Multi-passing mahdollistaa myös lausekkeiden käytön loputtomasti ennen niiden ilmoittamista.
Fasm ei sisällä käyttämättömien proseduurien ilmoituksia tulostiedostossa (toteutettu makrojen kautta).
Tulostiedoston sisältö riippuu vain lähdekoodin sisällöstä, ei käyttöjärjestelmäympäristöstä tai komentorivillä välitetyistä parametreista. Niille, joille tämä periaate oli hankala win32:lle, kehitettiin FA -kääre , jonka avulla voit yhdistää toisen tiedoston tiedostoon ei suoraan koodissa, vaan komentorivin kautta.
Fasmin lähdekoodi voidaan rakentaa suoraan suoritettavaan tiedostoon ohittaen väliobjektitiedostojen luomisen ja linkittämisen vaiheet.
Lähdekoodin kääntäminen tapahtuu useissa vaiheissa, jotka on eristetty toisistaan.
Tulostiedon lohkot kehystetään muotoon tarvittavilla otsikoilla, käsitellään dataa ja otsikkosuhteita, lasketaan tarkistussummat, lohkokoot... Luodaan tulostiedosto.
Ohjeiden kirjoittamiseen käytetään Intelin syntaksia .
Ainoa merkittävä ero muissa kokoajissa (MASM, TASM MASM-yhteensopivuustilassa) käytettävään formaattiin on se , että muistisolun arvo kirjoitetaan aina muodossa [label_name], mutta label_namese tarkoittaa yksinkertaisesti solun osoitetta (eli sarjanumeroa). Näin voit tehdä ilman avainsanaa offset. Myös fasmissa operandin kokoa määritettäessä byte ptrse kirjoitetaan yksinkertaisesti :n bytesijaan , tilalle word ptr - jne word. Yhdessä operandissa ei saa käyttää useita hakasulkeita - joten [bx][si]sinun on kirjoitettava sen sijaan [bx+si]. Nämä syntaksin muutokset johtivat yhtenäisempään ja helpommin luettavaan koodiin.
Esimerkki Windows-ohjelmasta Hei, maailma! ”, joka tulostaa tämän viestin funktiolla MessageBoxja päättyy:
muoto pe gui 4 .0 merkinnän alku sisältää ' win32a.inc ' aloita: kutsu MessageBox , NULL , viesti , viesti , MB_OK kutsu ExitProcess , 0 viesti db ' Hei , maailma ! ' , 0 tietojen tuontikirjasto kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' sisältää ' api / kernel32.inc ' sisältää ' api / user32.inc ' lopputiedot _ _Tai näin:
include ' win32ax.inc ' .code main: invoke MessageBox , NULL , ' Hei , Maailma ! ' , ' Fasm - viestilaatikko : ' , MB_OK kutsu ExitProcess , 0.end main _Monimutkaisempi versio PE-tiedoston osioiden selvennyksellä :
muoto pe gui -merkinnän alku sisältää ' win32a.inc ' osio ' .data ' tiedot luettavissa kirjoitettavissa viesti db ' Hei , maailma ! ' , 0 osa ' .code ' koodi luettavissa suoritettava aloita: kutsu MessageBox , NULL , viesti , viesti , MB_OK kutsu ExitProcess , 0 osio ' .idata ' tuo data luettava kirjoitettava kirjasto kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' tuonti kernel32 , \ ExitProcess , ' ExitProcess ' tuonti user32 , \ MessageBox , ' MessageBoxA 'Esimerkki yksinkertaisesta konsoliohjelmasta .COM -muodossa :
org 100h _ mov ah , 9 h mov dx , hei int 21 h mov ah , 8 h int 21 h int 20 h hei db 13 , 10 , " Hei , maailma ! $ "Esimerkki yksinkertaisesta ohjelmasta ELF -muodossa .
muoto ELF suoritettavan 3 merkinnän alku segmentin luettavissa oleva suoritettava tiedosto aloitus: mov eax , 4 mov ebx , 1 mov ecx , msg mov edx , msg_size int 0x80 mov eax , 1xor ebx , ebx int 0x80_ _ segmentti luettavissa kirjoitettava msg db ' Hei maailma ! ' , 0xA msg_size = $-msgOhjeen avulla formatvoit määrittää seuraavat tulostustiedostomuodot:
FASM-kielellä kirjoitetut käyttöjärjestelmät:
Kääntäjät, jotka käyttävät FASM:ää taustakokoonpanona:
FASM-pohjainen IDE:
Fasm-syntaksin tukitiedosto tulee Vim -peruspaketin mukana .
Fasmin käyttöä tukevat monet erikoistuneet IDE :t , kuten RadASM , WinAsm Studio , Fresh (suunniteltu erityisesti fasmille) jne.
kokoonpanokieli | |
---|---|
IDE | |
Kääntäjät | |
Syntaksimuodot _ |