NASM | |
---|---|
Tyyppi | kääntäjä |
Tekijä | Simon Tatham, Julian Hall |
Kehittäjät | H. Peter Anvin, Jim Kukunas, Cyrill Gorcunov, Frank B. Kotler |
Sisään kirjoitettu | C [1] |
Käyttöjärjestelmä | Linux , Mac OS , Windows , DOS , KolibriOS |
Ensimmäinen painos | 1996 |
Laitteistoalusta | x86, x86_64 |
uusin versio | 15.2.2020 (28. elokuuta 2020) |
Lisenssi | LGPL , versiosta 2.07 lähtien - yksinkertaistettu BSD-lisenssi |
Verkkosivusto | nasm.us |
NASM ( Netwide Assembler ) on ilmainen ( LGPL- ja BSD-lisenssi ) kokoaja Intel x86 -arkkitehtuurille . Käytetään 16-, 32- ja 64-bittisten ohjelmien kirjoittamiseen.
NASM:n loi Simon Tatham yhdessä Julian Hallin kanssa, ja sitä kehittää parhaillaan pieni kehitystiimi SourceForge.netissä . Se julkaistiin alun perin omalla lisenssillään, mutta tämä lisenssi muutettiin myöhemmin GNU LGPL :ksi monien lisenssivalinnan aiheuttamien ongelmien jälkeen. Versiosta 2.07 lähtien lisenssi on muutettu "yksinkertaistetuksi BSD:ksi" ( 2-lauseke BSD ).
NASM voi toimia muilla kuin x86-alustoilla, kuten SPARC ja PowerPC , mutta se luo koodia vain x86:lle ja x86-64:lle [2] .
NASM kilpailee menestyksekkäästi kaasukokoonpanostandardin kanssa Linuxissa ja monissa muissa UNIX-järjestelmissä . [3] [4] [5] NASM:n katsotaan olevan kaasua parempilaatuista. [5] Lisäksi oletusarvoinen [6] kaasuasentaja käyttää AT&T-syntaksia , joka on suunnattu muille kuin Intel-prosessoreille, kun taas NASM käyttää muunnelmaa perinteisestä Intelin syntaksista x86-asentajille ; Intelin syntaksia käyttävät kaikki DOS/Windows-asentajat, esim . MASM , TASM , fasm .
NASM käyttää Intelin syntaksia ohjeiden kirjoittamiseen. NASM-kokoonpanokielen lause (ohjelmarivi) voi koostua seuraavista elementeistä:
Label Ohje Operandit KommenttiOperandit erotetaan pilkulla. Voit käyttää mitä tahansa välilyöntejä ennen merkkijonoa ja lausekkeen jälkeen. Kommentti alkaa puolipisteellä ja kommentin loppu on rivin loppu. Ohjeena voidaan käyttää komentoa tai pseudo-komentoa (kääntäjädirektiivi). Jos rivi on hyvin pitkä, se voidaan siirtää seuraavaan kenoviivalla \, samalla tavalla kuin C -kielessä .
NASM kokoaa ohjelmia eri käyttöjärjestelmille x86-yhteensopivien prosessorien sisällä. Yhdessä käyttöjärjestelmässä voit vapaasti kääntää suoritettavan tiedoston toiselle.
Ohjelmien kääntäminen NASM:ssä koostuu kahdesta vaiheesta. Ensimmäinen on kokoonpano , toinen yhdistäminen . Kokoonpanovaiheessa luodaan objektikoodi. Se sisältää ohjelman konekoodin ja datan lähdekoodin mukaisesti , mutta tunnisteita (muuttujia, symboleja) ei ole vielä sidottu muistiosoitteisiin. Linkkivaiheessa yhdestä tai useammasta objektimoduulista luodaan suoritettava tiedosto (ohjelma) . Linkkitoiminto liittää pääohjelmassa määritellyt tunnisteet muissa moduuleissa määriteltyihin tunnisteisiin, minkä jälkeen kaikille tunnisteille annetaan lopulliset muistiosoitteet tai ne allokoidaan dynaamisesti.
Objektitiedostojen linkittämiseksi suoritettaviksi Windowsissa voit käyttää ilmaista alink-linkkeriä [4] (64-bittisille ohjelmille GoLink-linkkijä) ja Linuxissa ld-linkkeriä, joka on saatavilla tämän käyttöjärjestelmän kaikissa versioissa.
Kokoaksesi tiedoston anna seuraava komento:
nasm -f muodossa tiedostonimi -o lähtöKääntäjä käsittelee ohjelman tekstiä useissa ajoissa, jotta hyppykäskyt voidaan sijoittaa ennen vastaavien nimikkeiden ilmoittamista.
Ehdollisten ja ehdottomien ( jmp) hyppyjen komennoissa käytetään oletuksena lähellä olevaa hyppytyyppiä — near. Siksi, jos lyhyt hyppy on mahdollista, jotta ohjelman kokoa ei yliarvioida ylimääräisellä tavulla, on tarpeen määrittää erikseen hyppytyyppi short. Versiosta 0.98.09b lähtien on lisätty -Ox-optimointivaihtoehdot , joiden avulla voit automaattisesti optimoida haarakäskyjen koon [7] , aiemmissa versioissa tai ilman tällaisia valintoja, ohjelman vähimmäiskoko voidaan saada vain manuaalisesti muokkaamalla lähdekoodi.
NASM tukee monia tulostustiedostomuotoja, muun muassa [8] :
Tulostustiedostomuoto voidaan määrittää komentorivivalitsimella -f . Muodot voivat laajentaa joidenkin ohjeiden syntaksia ja lisätä omia ohjeitaan.
Ohjelmaesimerkkejä Hei maailma! , joka näyttää oikean viestin ja poistuu.
Linux- käyttöjärjestelmälle SECTION .data msg db " Hei , maailma ! " , 0xa len equ $ - msg SECTION .text global _start ; ohjelman aloituspiste _start: mov eax , 4 ; 'kirjoita' syscall mov ebx , 1 ; tiedosto descr. 1 (stdout) mov ecx , msg ; osoitin dataan mov edx , len ; tiedon määrä int 0x80 ; kutsu ytimeen mov eax , 1 ; '_exit' syscall mov ebx , 0 ; nolla poistumiskoodi (menestys) int 0x80 ; kutsu ytimeen Linux- käyttöjärjestelmälle (x64) globaali_aloitus _ section .text _start: mov rax , 1 ; järjestelmäkutsu 1 on kirjoitus mov rdi , 1 ; tiedostokahva 1 on stdout mov rsi , viesti ; tulostettavan merkkijonon osoite mov rdx , 13 ; tavujen määrä syscall ; kutsua käyttöjärjestelmää kirjoittamaan mov eax , 60 ; järjestelmäkutsu 60 on exit xor rdi , rdi ; poistumiskoodi 0 syscall ; kutsu käyttöjärjestelmä poistuaksesi viestistä: db " Hello , World " , 10 ; huomioi rivinvaihto lopussa DOS- käyttöjärjestelmän alla SECTION .text org 0x100 ; tätä ohjetta tarvitaan vain .com-tiedostossa, jossa ei ole osioita mov ah , 0x9 mov dx , hello int 0x21 mov ax , 0x4c00 ; ah == 0x4c al == 0x00 int 0x21 SECTION .data hei DB " Hei maailma ! " , 0xd , 0xa , ' $ ' Windows - käyttöjärjestelmälle (obj) % include ' WIN32N.INC ' EXTERN MessageBoxA Tuo MessageBoxA user32.dll EXTERN ExitProcess Import ExitProcess kernel32.dll OSA KOODI USE32 LUOKKA = KOODI ..start : push UINT MB_OK push LPCTSTR otsikko push LPCTSTR otsikko push LPCTSTR otsikko push HLLWSTR banner _ _ _ call [ ExitProcess ] SECTION DATA USE32 CLASS = DATA banner db ' Hei maailma ! _ ' , 0xD , 0xA , 0 otsikko db ' Hei ' , 0 Windows x64 -käyttöjärjestelmälle (obj) ; Hello.asm ULKOINEN MessageBoxW ULKOINEN ExitProcess SECTION .text USE64 aloitus: sub rsp , 28 h ; 32 tavua Microsoft x64 -kutsukäytännölle "varjotila" + 8 tavua pinon tasaamiseen 16 tavun rajaan kutsun jälkeen pinoon 8 tavua paluuosoite xor rcx , rcx ; HWND hWnd = NULL lea rdx , [ banneri ] ; LPCTSTR lpText = banneri lea r8 , [ otsikko ] ; LPCTSTR lpCaption = otsikko xor r9 , r9 ; UINT uType = MB_OK kutsu MessageBoxW ; MessageBox(hWnd, lpText, lpCaption, uType) xor rcx , rcx ; UINT uExitCode = 0 kutsu ExitProcess ; ExitProcess(uExitCode) SECTION .data banner dw __utf16__ ( ' Hei , maailma ! ' ), 0 otsikko dw __utf16__ ( ' Hei ! ' ), 0>nasm -f win64 Hello.asm
>golink Hello.obj kernel32.dll user32.dll
kokoonpanokieli | |
---|---|
IDE | |
Kääntäjät | |
Syntaksimuodot _ |