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ů.
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 .
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 .
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ýstupKompilá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.
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 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
jazyk symbolických instrukcí | |
---|---|
IDE | |
Překladatelé | |
Formáty syntaxe |