NASM

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 9. října 2021; kontroly vyžadují 27 úprav .
NASM
Typ kompilátor
Autor Simon Tatham, Julian Hall
Vývojáři H. Peter Anvin, Jim Kukunas, Cyrill Gorcunov, Frank B. Kotler
Zapsáno v C [1]
Operační systém Linux , Mac OS , Windows , DOS , KolibriOS
První vydání 1996
Hardwarová platforma x86, x86_64
Nejnovější verze 15.2.05 (28. srpna 2020)
Licence LGPL , od verze 2.07 - zjednodušená licence BSD
webová stránka nasm.us

NASM ( Netwide Assembler ) je bezplatný ( licence LGPL a BSD ) assembler pro architekturu Intel x86 . Používá se k zápisu 16-, 32- a 64bitových programů.

Historie

NASM vytvořil Simon Tatham s Julianem Hallem a v současné době je vyvíjen malým vývojovým týmem na SourceForge.net . Původně byla vydána pod vlastní licencí, ale tato licence byla později po mnoha problémech způsobených výběrem licence změněna na GNU LGPL . Od verze 2.07 byla licence změněna na "zjednodušené BSD" ( 2-klauzule BSD ).

NASM může běžet na platformách jiných než x86, jako je SPARC a PowerPC , ale generuje kód pouze pro x86 a x86-64 [2] .

NASM úspěšně konkuruje standardu gas assembler na Linuxu a mnoha dalších UNIXových systémech . [3] [4] [5] NASM je považován za kvalitnější než plyn. [5] Výchozí [6] plynový assembler navíc používá syntaxi AT&T , která je orientována na procesory jiných výrobců než Intel, zatímco NASM používá variantu tradiční syntaxe Intel pro x86 assemblery ; Syntaxi Intel používají všechny assemblery DOS/Windows, např. MASM , TASM , fasm .

Syntaxe jazyka

NASM používá pro zápis instrukcí syntaxi Intel . Věta v assembleru NASM (řádek programu) se může skládat z následujících prvků:

Popis operandů instrukce Komentář

Operandy jsou odděleny čárkou. Před řetězcem a za příkazem můžete použít libovolný počet mezer. Komentář začíná středníkem a konec komentáře je konec řádku. Jako instrukce lze použít příkaz nebo pseudopříkaz (direktivu kompilátoru). Pokud je řádek velmi dlouhý, lze jej přesunout na další pomocí zpětného lomítka \, podobně jako v jazyce C .

Kompilace a propojení

NASM kompiluje programy pro různé operační systémy v procesorech kompatibilních s x86. V jednom operačním systému můžete volně zkompilovat spustitelný soubor pro jiný.

Kompilace programů v NASM se skládá ze dvou kroků. První je montáž , druhá je spojování . Ve fázi sestavování je vytvořen objektový kód. Obsahuje strojový kód programu a data v souladu se zdrojovým kódem , ale identifikátory (proměnné, symboly) ještě nejsou vázány na adresy paměti. Ve fázi propojení je z jednoho nebo více objektových modulů vytvořen spustitelný soubor (program) . Operace spojení spojuje identifikátory definované v hlavním programu s identifikátory definovanými v jiných modulech, načež jsou všem identifikátorům přiděleny konečné adresy paměti nebo jsou dynamicky přiděleny.

Chcete-li propojit objektové soubory do spustitelných souborů v systému Windows, můžete použít bezplatný linker alink [4] (pro 64bitové programy linker GoLink) a v systému Linux linker ld, který je dostupný v jakékoli verzi tohoto operačního systému.

Chcete-li sestavit soubor, zadejte následující příkaz:

nasm -f formát názvu souboru -o výstup

Pokyny pro skok

Kompilátor zpracovává text programu v několika průchodech, takže instrukce skoku mohou být umístěny před deklarací odpovídajících návěští.

V příkazech podmíněných a nepodmíněných ( jmp) skoků se standardně používá blízký typ skoků — near. Pokud je tedy možný krátký skok, aby nedošlo k přecenění velikosti programu o bajt navíc, je nutné konkrétně specifikovat typ skoku short. Od verze 0.98.09b byly přidány možnosti optimalizace -Ox , které umožňují automaticky optimalizovat velikost instrukcí větve [7] , v dřívějších verzích nebo bez těchto možností lze minimální velikost programu získat pouze ruční úpravou zdrojový kód.

Formát výstupního souboru

NASM podporuje mnoho formátů výstupních souborů, mezi nimi [8] :

Formát výstupního souboru lze určit pomocí přepínače příkazového řádku -f . Formáty mohou rozšířit syntaxi některých instrukcí a přidat vlastní instrukce.

Příklady aplikace Hello, world! » pro různé operační systémy

Příklady programů Hello, world! , která zobrazí příslušnou zprávu a ukončí se.

Pro operační systém Linux SECTION .data msg db " Ahoj , světe ! " , 0xa len equ $ - msg SECTION .text global _start ; vstupní bod programu _start: mov eax , 4 ; 'write' syscall mov ebx , 1 ; popis souboru 1 (stdout) mov ecx , msg ; ukazatel na data mov edx , len ; množství dat int 0x80 ; volání do jádra mov eax , 1 ; '_exit' syscall mov ebx , 0 ; nulový výstupní kód (úspěch) int 0x80 ; volání do jádra Pro operační systém Linux (x64) global_start _ sekce .text _start: mov rax , 1 ; systémové volání 1 je zápis mov rdi , 1 ; popisovač souboru 1 je stdout mov rsi , zpráva ; adresa výstupního řetězce mov rdx , 13 ; počet bajtů syscall ; vyvolejte operační systém pro provedení zápisu mov eax , 60 ; systémové volání 60 je exit xor rdi , rdi ; ukončovací kód 0 syscall ; vyvolejte operační systém pro ukončení zpráva: db " Ahoj , světe " , 10 ; všimněte si nového řádku na konci Pod operačním systémem DOS SECTION .text org 0x100 ; tato směrnice je potřeba pouze v případě souboru .com, který nemá žádné sekce mov ah , 0x9 mov dx , hello int 0x21 mov ax , 0x4c00 ; ah == 0x4c al == 0x00 int 0x21 SECTION .data hello DB " Hello , world ! " , 0xd , 0xa , ' $ ' Pro operační systém Windows (obj) % include ' WIN32N.INC ' EXTERNÍ MessageBoxA Import MessageBoxA user32.dll EXTERNÍ ExitProcess Import ExitProcess kernel32.dll KÓD SEKCE USE32 CLASS = KÓD ..start : push UINT MB_OK push LPCTSTR title push LPCTSTR push LPCTSTR banner push HWLLBANULL _ _ _ _ _ call [ ExitProcess ] SEKCE DATA USE32 CLASS = DATA banner db ' Ahoj , světe ! ' , 0xD , 0xA , 0 title db ' Hello ' , 0 Pro operační systém Windows x64 (obj) ; Hello.asm EXTERNÍ MessageBoxW EXTERN ExitProcess SECTION .text USE64 start: sub rsp , 28 h ; 32 bajtů pro Microsoft x64 volající konvenci "stínový prostor" + 8 bajtů pro zarovnání zásobníku na hranici 16 bajtů po volání na zásobník 8 bajtů návratová adresa xor rcx , rcx ; HWND hWnd = NULL lea rdx , [ banner ] ; LPCTSTR lpText = banner lea r8 , [ název ] ; LPCTSTR lpCaption = titulek xor r9 , r9 ; UINT uType = MB_OK volání MessageBoxW ; MessageBox(hWnd, lpText, lpCaption, uType) xor rcx , rcx ; UINT uExitCode = 0 volání ExitProcess ; ExitProcess(uExitCode) SEKCE .data banner dw __utf16__ ( ' Ahoj , světe ! ' ), 0 název dw __utf16__ ( ' Ahoj ! ' ), 0

>nasm -f win64 Hello.asm
>golink Hello.obj kernel32.dll user32.dll

Pro operační systém FreeBSD SECTION .data msg db " Ahoj , světe ! " , 0xa len equ $ - msg SECTION .text global _start ; vstupní bod programu _start: push dword len push dword msg push dword 1 ; 1 je deskriptor souboru stdout mov eax , 4 ; 4 je 'write' syscall push eax ; musíme na zásobníku ponechat další dword int 0x80 ; volání do jádra add esp , 16 ; vyčistit zásobník push dword 0 ; 0 je výstupní kód (úspěch) mov eax , 1 ; 1 je '_exit' syscall push eax ; extra dword na zásobníku int 0x80 ; volání do jádra ; žádné čištění - nikdy se nevrátíme Pod operačním systémem KolibriOS [9] bitů 32 % zahrnuje sekci ' mos.inc ' .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 jz stisknutá klávesa ; máme jen jedno tlačítko, zavřeme klávesu MOS_EXIT : ;stisknutou klávesu, přečti si ji a ignoruj ​​mov eax , MOS_SC_GETKEY int 0x40 jmp wait_event draw_window : MOS_STARTREDRAW xor eax , eax mov ebx , 10 * 6505mov ebx , 10 * 6450536 + 5m 5m edx , 0x33FFFFFF mov edi , hlavička int 0x40 ; definovat & draw okno mov eax , MOS_SC_WRITETEXT mov ebx , 30 * 65536 + 10 mov ecx , 0x80000000 MOS_řetězec zobrazení MOS_řetězec 0x80000000 MOS_řetězec zobrazení dat světa db4000 movdb4 world string _ _ _ _ _ _ _ _ světe ! ' , 0 image_end: section .bss alignb 4 stack resb 1024 stacktop: memory_end:

Pozoruhodné programy napsané v NASM

  • Asmutils  je sada systémových utilit pro operační systémy BSD, UnixWare, Solaris a AtheOS .
  • Projekt AsmOS [10]  je operační systém v assembleru NASM (v současnosti ve vývoji).

Poznámky

  1. Projekt nasm Open Source na Open Hub: Stránka jazyků - 2006.
  2. 1.1 Co je NASM? (nedostupný odkaz) . The Netwide Assembler: NASM . Oficiální stránka. - "NASM, je assembler 80x86 a x86-64". Získáno 14. července 2010. Archivováno z originálu 18. února 2012. 
  3. Assemblery pro Linux: Porovnání GAS a NASM . Získáno 14. července 2010. Archivováno z originálu 16. srpna 2011.
  4. 1 2 Použití sestavy NASM v systému Windows (stahování) . Datum přístupu: 17. července 2010. Archivováno z originálu 20. července 2009. 
  5. 1 2 Randall Hyde. Který assembler je nejlepší?  (anglicky)  (nedostupný odkaz) . Datum přístupu: 18. července 2010. Archivováno z originálu 18. února 2012.
  6. Podpora syntaxe Intel volaná prostřednictvím speciální direktivy .intel_syntaxse objevila v gas-2.10; viz gas/NEWS  (eng.)  (downlink) . Datum přístupu: 18. července 2010. Archivováno z originálu 18. února 2012.
  7. C.2.33 Verze 0.98.09b s opravami Johna Coffmana vydaná 28. října 2001 (downlink) . The Netwide Assembler: NASM. Dodatek C: Historie verzí NASM . Oficiální stránka. Datum přístupu: 18. července 2010. Archivováno z originálu 18. února 2012. 
  8. Kapitola 7: Výstupní formáty (downlink) . The Netwide Assembler: NASM . Oficiální stránka. Získáno 14. července 2010. Archivováno z originálu 18. února 2012. 
  9. Použití různých kompilátorů v Hummingbirds . Získáno 10. února 2022. Archivováno z originálu 10. února 2022.
  10. Operační systém v assembleru NASM . Získáno 5. července 2010. Archivováno z originálu dne 20. října 2011.

Literatura

  • Rudolf Marek. Assembler s příklady. Základní kurz. - Petrohrad. : Věda a technika, 2005. - 240 s. — ISBN 5-94387-232-9 .
  • A. V. Stolyarov. NASM programování v assembleru pro Unix OS . - M. : MAKS Press, 2011. - 188 s. - ISBN 978-5-317-03627-0 .

Odkazy