NASM | |
---|---|
Típusú | fordítóprogram |
Szerző | Simon Tatham, Julian Hall |
Fejlesztők | H. Peter Anvin, Jim Kukunas, Cyrill Gorcunov, Frank B. Kotler |
Beírva | C [1] |
Operációs rendszer | Linux , Mac OS , Windows , DOS , KolibriOS |
Első kiadás | 1996 |
Hardver platform | x86, x86_64 |
legújabb verzió | 2.15.05 (2020. augusztus 28.) |
Engedély | LGPL , a 2.07-es verzió óta - egyszerűsített BSD licenc |
Weboldal | nasm.us |
A NASM ( Netwide Assembler ) egy ingyenes ( LGPL és BSD licenc ) összeszerelő az Intel x86 architektúrához . 16, 32 és 64 bites programok írására szolgál.
A NASM-et Simon Tatham és Julian Hall hozta létre, és jelenleg a SourceForge.net egy kis fejlesztőcsapata fejleszti . Eredetileg saját licenc alatt adták ki, de ezt a licencet később GNU LGPL -re változtatták a licencválasztás okozta sok probléma után. A 2.07-es verziótól kezdve a licenc „egyszerűsített BSD-re” ( 2-clause BSD ) módosult .
A NASM futhat nem x86-os platformokon, például SPARC -on és PowerPC -n , de csak x86-hoz és x86-64-hez generál kódot [2] .
A NASM sikeresen felveszi a versenyt a gázösszeszerelő szabvánnyal Linuxon és sok más UNIX rendszeren . [3] [4] [5] A NASM-et jobb minőségűnek tartják, mint a gázt. [5] Ezen túlmenően az alapértelmezett [6] gas assembler AT&T szintaxist használ , amely nem Intel processzorokra irányul, míg a NASM a hagyományos Intel szintaxis egy változatát használja az x86 assemblerekhez ; Az Intel szintaxist minden DOS/Windows assembler használja, például MASM , TASM , fasm .
A NASM az Intel szintaxisát használja az utasítások írására. Egy NASM assembly nyelvű mondat (programsor) a következő elemekből állhat:
Címke Utasítás Operandusok MegjegyzésAz operandusokat vessző választja el. A karakterlánc előtt és az utasítás után tetszőleges számú szóköz karaktert használhat. A megjegyzés pontosvesszővel kezdődik, és a megjegyzés vége a sor vége. Utasításként egy parancs vagy pszeudo-parancs (fordító direktíva) használható. Ha a sor nagyon hosszú, akkor egy fordított perjellel áthelyezhető a következőre \, hasonlóan a C nyelvhez .
A NASM különféle operációs rendszerekhez fordít programokat x86-kompatibilis processzorokon belül. Az egyik operációs rendszerben szabadon lefordíthat futtatható fájlt egy másikhoz.
A programok NASM-ben történő fordítása két lépésből áll. Az első az összeszerelés , a második az összekapcsolás . Az összeállítási szakaszban létrejön az objektumkód. Tartalmazza a program gépi kódját és az adatokat, a forráskódnak megfelelően , de az azonosítók (változók, szimbólumok) még nincsenek memóriacímekhez kötve. A link szakaszban egy végrehajtható fájl (program) jön létre egy vagy több objektummodulból . A link művelet a főprogramban meghatározott azonosítókat társítja más modulokban definiált azonosítókkal, ami után minden azonosító végleges memóriacímet kap, vagy dinamikusan allokál.
Objektumfájlok futtatható fájlokba való összekapcsolásához Windows rendszeren használhatja az ingyenes alink linkert [4] (64 bites programok esetén a GoLink linker), Linuxon pedig az ld linkert, amely az operációs rendszer bármely verziójában elérhető.
A fájl összeállításához írja be a következő parancsot:
nasm -f formátumú fájlnév -o kimenetA fordító több lépésben dolgozza fel a programszöveget, így az ugrási utasítások a megfelelő címkék deklarálása előtt helyezhetők el.
A feltételes és feltétel nélküli ( jmp) ugrások parancsaiban alapértelmezés szerint a közeli típusú ugrások használatosak — near. Ezért, ha lehetséges egy rövid ugrás, hogy ne becsüljük túl a program méretét egy extra bájttal, meg kell adni az ugrás típusát short. A 0.98.09b verziótól kezdve az -Ox optimalizálási opciók kerültek hozzáadásra , amelyek lehetővé teszik az elágazási utasítások méretének automatikus optimalizálását [7] , a korábbi verziókban vagy ilyen opciók nélkül a minimális programméretet csak a program kézi módosításával lehet elérni. forráskód.
A NASM számos kimeneti fájlformátumot támogat, köztük [8] :
A kimeneti fájl formátumát az -f parancssori kapcsolóval lehet megadni . A formátumok kiterjeszthetik egyes utasítások szintaxisát, és hozzáadhatják saját utasításaikat.
Programpéldák Hello, world! , amely megjeleníti a megfelelő üzenetet és kilép.
Linux operációs rendszerhez SECTION .data msg db " Hello , world ! " , 0xa len equ $ - msg SECTION .text global _start ; a program belépési pontja _start: mov eax , 4 ; 'írás' syscall mov ebx , 1 ; fájl leírása. 1 (stdout) mov ecx , msg ; adatmutató mov edx , len ; adatmennyiség int 0x80 ; a kernel hívása mov eax , 1 ; '_exit' syscall mov ebx , 0 ; nulla kilépési kód (siker) int 0x80 ; hívja meg a rendszermagot Linux operációs rendszerhez (x64) global_start _ szakasz .text _start: mov rax , 1 ; az 1. rendszerhívás: mov rdi , 1 ; az 1. fájlkezelő stdout mov rsi , üzenet ; mov rdx , 13 kimenethez tartozó karakterlánc címe ; bájtok száma syscall ; hívja meg az operációs rendszert az íráshoz mov eax , 60 ; A 60-as rendszerhívás az xor rdi , rdi kilépés ; kilépési kód 0 syscall ; az operációs rendszer meghívása a kilépéshez : db " Hello , World " , 10 ; jegyezze meg az új sort a végén DOS operációs rendszer alatt SECTION .text org 0x100 ; erre az utasításra csak olyan .com fájl esetén van szükség, amely nem tartalmaz szakaszokat mov ah , 0x9 mov dx , hello int 0x21 mov ax , 0x4c00 ; ah == 0x4c al == 0x00 int 0x21 SECTION .data hello DB " Helló világ ! " , 0xd , 0xa , ' $ ' Windows operációs rendszerhez (obj) % include ' WIN32N.INC ' EXTERN MessageBoxA Import MessageBoxA user32.dll EXTERN ExitProcess Import ExitProcess kernel32.dll SZEKCIÓKÓD USE32 CLASS = KÓD ..start : push UINT MB_OK push UNT MB_OK push UNTSTRAT title push LPCTSTR title push LPCTSTR banner NULLLA push LPCTWSTR banner call [ ExitProcess ] SECTION DATA USE32 CLASS = DATA banner db ' Hello , world ! ' , 0xD , 0xA , 0 cím db ' Hello ' , 0 Windows x64 operációs rendszerhez (obj) ; Hello.asm EXTERN MessageBoxW EXTERN ExitProcess SECTION .text USE64 start: sub rsp , 28 h ; 32 bájt a Microsoft x64 hívási konvencióhoz "árnyéktér" + 8 bájt a veremhez igazításhoz a 16 bájtos határhoz a veremre helyezés után 8 bájt visszatérési cím xor rcx , rcx ; HWND hWnd = NULL lea rdx , [ banner ] ; LPCTSTR lpText = banner lea r8 , [ cím ] ; LPCTSTR lpCaption = cím xor r9 , r9 ; UINT uType = MB_OK MessageBoxW hívása ; MessageBox(hWnd, lpText, lpCaption, uType) xor rcx , rcx ; UINT uExitCode = 0 ExitProcess hívás ; ExitProcess(uExitCode) SECTION .data banner dw __utf16__ ( ' Hello , world ! ' ), 0 cím dw __utf16__ ( ' Hello ! ' ), 0>nasm -f win64 Hello.asm
>golink Hello.obj kernel32.dll user32.dll
Assembly nyelv | |
---|---|
IDE | |
Fordítók | |
Szintaxis formátumok |