NASM

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 9. lokakuuta 2021 tarkistetusta versiosta . tarkastukset vaativat 27 muokkausta .
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.

Historia

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 .

Kielen syntaksi

NASM käyttää Intelin syntaksia ohjeiden kirjoittamiseen. NASM-kokoonpanokielen lause (ohjelmarivi) voi koostua seuraavista elementeistä:

Label Ohje Operandit Kommentti

Operandit 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ä .

Kääntäminen ja linkittäminen

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ö

Hyppyohjeet

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.

Tulostustiedostomuoto

NASM tukee monia tulostustiedostomuotoja, muun muassa [8] :

Tulostustiedostomuoto voidaan määrittää komentorivivalitsimella -f . Muodot voivat laajentaa joidenkin ohjeiden syntaksia ja lisätä omia ohjeitaan.

Esimerkkejä Hello, world! » eri käyttöjärjestelmille

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

FreeBSD- käyttöjärjestelmälle SECTION .data msg db " Hei , maailma ! " , 0xa len equ $ - msg SECTION .text global _start ; ohjelman aloituskohta _start: push dword len push dword msg push dword 1 ; 1 on tiedostokuvaaja stdout mov eax , 4 ; 4 on "kirjoita" syscall push eax ; meidän täytyy jättää ylimääräinen dword pinoon int 0x80 ; kutsu ytimeen add esp , 16 ; puhdista pino push dword 0 ; 0 on poistumiskoodi (menestys) mov eax , 1 ; 1 on '_exit' syscall push eax ; extra dword pinossa int 0x80 ; kutsu ytimeen ; ei siivousta - emme koskaan palaa Käyttöjärjestelmässä KolibriOS [9] bitit 32 % sisältävät ' mos.inc ' -osion .text MOS_HEADER01 main , image_end , memory_end , stacktop , 0 , 0 main: redraw : call draw_window wait_event: MOS_WAITEVENT dec eax jz redraw dec eax painetaan näppäintä ; meillä on vain yksi painike, sulje MOS_EXIT- näppäin : ;näppäintä painettuna , lue se ja jätä huomioimatta mov eax , MOS_SC_GETKEY int 0x40 jmp wait_event draw_window : MOS_STARTREDRAW xor eax , eax mov ebx , 10 * 61506v , 5 mov 5 +0 hei _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Maailma ! ' , 0 image_end: section .bss alignb 4 pino resb 1024 stacktop: memory_end:

Merkittäviä NASM:llä kirjoitettuja ohjelmia

  • Asmutils  on joukko järjestelmäapuohjelmia BSD-, UnixWare-, Solaris- ja AtheOS -käyttöjärjestelmille .
  • AsmOS -projekti [10]  on käyttöjärjestelmä NASM assemblerissä (tällä hetkellä kehitteillä).

Muistiinpanot

  1. nasm Open Source -projekti Open Hubissa: Languages Page - 2006.
  2. 1.1 Mikä on NASM? (linkki ei saatavilla) . Netwide Assembler: NASM . Virallinen sivusto. - "NASM, on 80x86- ja x86-64-asentaja". Haettu 14. heinäkuuta 2010. Arkistoitu alkuperäisestä 18. helmikuuta 2012. 
  3. Assemblers for Linux: GAS:n ja NASM:n vertailu . Haettu 14. heinäkuuta 2010. Arkistoitu alkuperäisestä 16. elokuuta 2011.
  4. 1 2 NASM Assemblyn käyttäminen Windowsissa (downlink) . Käyttöpäivä: 17. heinäkuuta 2010. Arkistoitu alkuperäisestä 20. heinäkuuta 2009. 
  5. 1 2 Randall Hyde. Mikä Assembler on paras?  (englanniksi)  (linkki ei ole käytettävissä) . Käyttöpäivä: 18. heinäkuuta 2010. Arkistoitu alkuperäisestä 18. helmikuuta 2012.
  6. Tuki Intelin syntaksille, jota kutsutaan erityisdirektiivin kautta .intel_syntax, ilmestyi kaasu-2.10:ssä; katso kaasu/UUTISET  (eng.)  (downlink) . Käyttöpäivä: 18. heinäkuuta 2010. Arkistoitu alkuperäisestä 18. helmikuuta 2012.
  7. C.2.33 Versio 0.98.09b, jossa on John Coffmanin korjaustiedostoja, julkaistu 28. lokakuuta 2001 (downlink) . Netwide Assembler: NASM. Liite C: NASM-versiohistoria . Virallinen sivusto. Käyttöpäivä: 18. heinäkuuta 2010. Arkistoitu alkuperäisestä 18. helmikuuta 2012. 
  8. Luku 7: Tulostusmuodot (downlink) . Netwide Assembler: NASM . Virallinen sivusto. Haettu 14. heinäkuuta 2010. Arkistoitu alkuperäisestä 18. helmikuuta 2012. 
  9. Erilaisten kääntäjien käyttö Hummingbirdsissä . Haettu 10. helmikuuta 2022. Arkistoitu alkuperäisestä 10. helmikuuta 2022.
  10. Käyttöjärjestelmä NASM assemblerissä . Haettu 5. heinäkuuta 2010. Arkistoitu alkuperäisestä 20. lokakuuta 2011.

Kirjallisuus

  • Rudolf Marek. Kokoonpanija esimerkein. Peruskurssi. - Pietari. : Tiede ja tekniikka, 2005. - 240 s. — ISBN 5-94387-232-9 .
  • A. V. Stolyarov. NASM Assembly Language Programming for Unix OS . - M. : MAKS Press, 2011. - 188 s. - ISBN 978-5-317-03627-0 .

Linkit