lapos szerelő | |
---|---|
| |
Típusú | fordítóprogram |
Fejlesztő | Tomasz Gryshtar |
Beírva | Assembly nyelv |
Operációs rendszer | Unix-szerű operációs rendszer , Microsoft Windows , MS-DOS , DOS , Linux , OpenBSD , MenuetOS és KolibriOS |
Első kiadás | 1999 |
legújabb verzió | 1.73.30 [1] (2022. február 21. ) |
Generált fájlformátumok | Végrehajtható és linkelhető formátum , COFF és hordozható végrehajtható |
Engedély | 2 szakaszos BSD-licenc [2] |
Weboldal | flatassembler.net _ |
A fasm ( a flat as se m bler rövidítése ) egy ingyenes többlépcsős assembler , amelyet Tomasz Grysztar írt . A fasm önálló [1] , eredetileg a TASM -mel lett összeállítva, és 1999. május 4. óta 0.90-es verzióban építhető natív forrásokból. A fasm kis méretű, és nagyon nagy a fordítási sebessége , gazdag és tágas makró szintaxisa lehetővé teszi számos rutinfeladat automatizálását [3] [4] . Az objektumformátumok és a végrehajtható fájlformátumok egyaránt támogatottak. Ezzel a legtöbb esetben nincs szükség linkerre . Más esetekben harmadik féltől származó linkereket kell használnia, mivel az egyiket nem terjesztik a fasm-mal.
A processzor és társprocesszor alapvető utasításkészlete mellett[ mi? ] , a fasm támogatja az MMX , SSE , SSE2 , SSE3 , SSSE3 , SSE4.1 , SSE4.2 , SSE4a , AVX , AVX-2 , AVX-512 , 3DNow! , további kiterjesztések AES , CLMUL , FMA , FMA4 , XOP , valamint EM64T és AMD64 (beleértve az AMD SVM-et és az Intel SMX-et is).
A fasm minden változata közvetlenül létrehozhat kimeneti fájlokat az assemblerben előre definiált következő formátumokban: objektumfájlok (szabvány a legtöbb assembler számára): végrehajtható és linkelhető formátum (ELF) vagy közös objektumfájlformátum (COFF) (klasszikus vagy a Microsoft specifikációjában), futtatható fájlok (nem igényel további linkereket): MZ , ELF vagy Portable Executable (PE) (WDM illesztőprogramok mellékelve, az MZ DOS csonk konfigurálásának lehetőségével). Az előre beállítotttól eltérő formátumú fájlok generálásához létezik egy bináris fájlformátum, amely teljes ellenőrzést biztosít a programozó számára a kimeneti fájl minden egyes bájtja felett, azonban a programozónak le kell írnia az ilyen fájl teljes szerkezetét, tartalmát és kapcsolatait. fájlt közvetlenül.
A natív célarchitektúrák az IA32 és x86-64 architektúrák . Van egy nem hivatalos fasmarm-kiegészítés , amely ARM és ARM64 natív célarchitektúrákkal rendelkezik. A natívtól eltérő célarchitektúrák megvalósítása hasonló bármely más assembler hasonló megvalósításához – erre a célra makrókat és adatdefiníciós direktívákat használnak.
A fasm-ban egy program összeállítása három szakaszból áll: előfeldolgozásból, elemzésből és összeállításból.
Az első szakasz (előfeldolgozás ) 1 lépésben történik, először a forrásszöveg tokenizálása, majd az összes processzor direktíva felismerése és feldolgozása, az összes makró és az összes szimbolikus állandó kibővítése. Mivel ehhez a szakaszhoz nincsenek további átadások, az ebben a szakaszban feldolgozott nyelvi elemeket használat előtt deklarálni kell.
A második szakasz, ebben a szakaszban a tokenek további osztályozása történik (mivel még a tokenek típusai és a velük szemben támasztott követelmények is kissé eltérnek az előfeldolgozás és összeszerelés szakaszában), egyes tokenek esetében további tulajdonságstruktúrák jönnek létre, amelyek később az összeszerelés során használható.
Az összeállítási szakaszban meghatározzák a címkecímeket , feldolgozzák a feltételes direktívákat, megnyitják a hurkokat, és előállítják a tényleges programot. A fasm egy többlépéses assembler, amely lehetővé teszi bizonyos optimalizálások elvégzését (például rövid ugrást generál egy címkére egy hosszú helyett). Az áthaladás során a fordító nem mindig értékeli ki a kifejezést feltételes direktívákban. Ebben az esetben választ, és megpróbálja tovább fordítani. Mivel az N. lépésben kiszámított címkecímeket az N+1. lépésben használják, ez a folyamat általában konvergál.
A projektet 1999-ben Tomasz Grysztar ( lengyelül: Tomasz Grysztar ) indította el, aki akkor még diák volt. A forráskódja teljes egészében TASM assembly nyelven íródott . A 0.90-es verziótól (1999. május 4.) a fasm assembler önellátóvá vált (forráskódját az anyanyelvi dialektushoz igazították, és maga a fasm assembler állította össze). 2000 márciusában a fasm megjelent az interneten.
Kezdetben a fasm csak 16 bites lapos valós módból futott . Ezután hozzáadták a 32 bites támogatást, és ezen felül a DPMI támogatást . A forráskódot átírták, így könnyen áthelyezhető bármely 32 bites címzést támogató x86 operációs rendszerre. Windowsra, majd Linuxra portolták.
A Fasm hajlamos az előfeldolgozó direktívák lehető legkisebb halmazát használni, pl. előre definiált direktívákban tilos új direktívákat bevezetni, amelyek funkcionalitása meglévő direktívakészlettel érhető el. Ez alól kivételt képeznek a történelmileg felcserélhető irányelvek.
A Fasm egy multi-pass assembler optimista előrejelzéssel, i.e. az első lépésben az assembler feltételezi, hogy minden utasítás a lehető legkisebb formáját ölti. A többszörös átadás lehetővé teszi a kifejezések korlátlan ideig történő használatát, mielőtt deklarálásra kerülnének.
A Fasm nem tartalmazza a nem használt eljárások deklarációit a kimeneti fájlban (makrók segítségével).
A kimeneti fájl tartalma csak a forráskód tartalmától függ, és nem függ az operációs rendszer környezetétől vagy a parancssorban átadott paraméterektől. Azok számára, akiknek ez az elv kényelmetlen volt a win32 számára, kifejlesztették az FA wrappert , amely lehetővé teszi egy másik fájl csatlakoztatását a fájlhoz nem közvetlenül a kódban, hanem a parancssorban.
A fasm forráskódja közvetlenül beépíthető egy végrehajtható fájlba, megkerülve a közbenső objektumfájlok létrehozásának és összekapcsolásának szakaszait.
A forráskód összeállítása több, egymástól elszigetelt szakaszban történik.
A kimeneti adatok blokkjait a formátumhoz szükséges fejlécekkel keretezzük, feldolgozzuk az adatokat, fejléc kapcsolatokat, ellenőrző összegeket, blokkméreteket számolunk... Kimeneti fájl generálódik.
Az utasítások írására az Intel szintaxisát használják.
Az egyetlen lényeges különbség a többi assemblerben ( MASM , TASM MASM kompatibilitási módban TASM) elfogadott formátumhoz képest, hogy a memóriacella értéke mindig a következővel van írva [label_name], hanem egyszerűen label_namea cella címét (vagyis a sorozatszámát) jelenti. Ez lehetővé teszi a kulcsszó nélkül offset. Szintén a fasm-ban, amikor egy operandus méretét újradefiniálják, byte ptregyszerűen a , a - bytehelyett stb. helyett írják . Nem szabad több szögletes zárójelet használni egy operandusban - ezért helyette . Ezek a szintaktikai változtatások egységesebb és könnyebben olvasható kódot eredményeztek. word ptrword[bx][si][bx+si]
Egy példa Windows program Hello, world! ”, amely kinyomtatja ezt az üzenetet egy függvénnyel MessageBox, és a következővel végződik:
formátum pe gui 4 .0 bejegyzés kezdete tartalmazza a ' win32a.inc ' start: invoke MessageBox , NULL , message , message , MB_OK invoke ExitProcess , 0 üzenet db ' Hello , World ! ' , 0 adatimportálási könyvtár kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' tartalmazza az ' api / kernel32.inc ' include ' api / user32.inc ' végadatokat _Vagy így:
include ' win32ax.inc ' .code main: invoke MessageBox , NULL , ' Hello , World ! ' , ' Fasm üzenetdoboz : ' , MB_OK invoke ExitProcess , 0 .end main _Egy bonyolultabb változat, a PE-fájl szakaszainak pontosításával :
formátum pe gui bejegyzés kezdete tartalmazza a " win32a.inc " szakasz ' .data ' adat olvasható írható üzenet db ' Hello , World ! ' , 0 szakasz ' .code ' kód olvasható futtatható start: invoke MessageBox , NULL , message , message , MB_OK invoke ExitProcess , 0 szakasz ' .idata ' adatok importálása olvasható írható könyvtár kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' import kernel32 , \ ExitProcess , ' ExitProcess ' import user32 , \ MessageBox , ' MessageBoxA 'Példa egy egyszerű konzolprogramra .COM formátumban :
org 100h _ mov ah , 9 h mov dx , hello int 21 h mov ah , 8 h int 21 h int 20 h hello db 13 , 10 , " Hello , World ! $ "Példa egy egyszerű programra ELF formátumban .
formátum ELF végrehajtható 3 bejegyzés kezdete szegmens olvasható végrehajtható kezdés: mov eax , 4 mov ebx , 1 mov ecx , msg mov edx , msg_size int 0x80 mov eax , 1xor ebx , ebx int 0x80_ _ szegmens olvasható írható msg db ' Helló világ ! ' , 0xA msg_size = $-msgA direktíva formatsegítségével a következő kimeneti fájlformátumokat adhatja meg:
FASM nyelven írt operációs rendszerek:
A FASM-et háttérösszeállítóként használó fordítók:
FASM alapú IDE:
A fasm szintaxistámogató fájl az alap Vim csomaggal érkezik .
A fasm használatát számos speciális IDE támogatja, mint például a RadASM , a WinAsm Studio , a Fresh (kifejezetten a fasm-hez tervezett) stb.
Assembly nyelv | |
---|---|
IDE | |
Fordítók | |
Szintaxis formátumok |