Netwide Assembler

programovací jazyk

Netwide Assembler (NASM) je multiplatfomní kompilátor programovacího jazyka assembler s podporou architektury x86 a x86-64 s podporou mnoha výstupních formátů. NASM podporuje všechny instrukční sady včetně nedokumentovaných a včetně specifických instrukcí některých procesorů. Kromě vlastního překladače má i velmi omezený dissassembler s názvem ndisasm.

Netwide Assembler
Logo
VývojářHans Peter Anvin
První vydání1996
Aktuální verze2.16.03 (17. dubna 2024)
Operační systémmultiplatformní software
Linux
Mac OS Classic
Microsoft Windows
DOS
KolibriOS
BSD
Platformax86
Vyvíjeno vC
Typ softwarusvobodný software, programovací jazyk, x86 assembly language, Assembler a překladač
Licence2-clause BSD License
GNU Lesser General Public License
BSD licence
Webwww.nasm.us
Některá data mohou pocházet z datové položky.

Výhodou NASM je možnost spojit jej s jinými programovacími jazyky na mnoha platformách a pod mnoha kompilátory, aniž byste museli své assemblerovské kódy přepisovat z důvodů změny syntaxe. Podporuje například Linuxové formáty ELF, a.out, dále Windowsovské formáty COFF (používá GCC kompilátor a DJGPP kompilátor), win32 (Microsoftí formát používaný MS Visual Studiem pro 32bitové prostředí), win64 (formát MS Visual Studia pro 64bitové prostředí), DOSovské formáty obj (pro MS-DOS programy), a mnohé další.

NASM je free software (jedna z nejsvobodnějších licencí BSD).

Příznivým důsledkem toho, že NASM je psaný kompletně v jazyce C, je, že je možné jej použít a přeložit prakticky na libovolnou platformu. Je možné ho tedy používat v DOSu, OS/2, Windows, Linuxu i BSD. Na další platformy ho lze snadno přeložit. Pracuje dokonce i na platformách s jinou architekturou, než je x86 a x86-64, čímž umožňuje i křížový překlad na rozdíl od třeba FASM, který je psán v assembleru, a křížový překlad neumožňuje, stejně tak je mnohem těžší portovat jej na jiné platformy.

Používá tradiční Intel syntax, na rozdíl od například GNU Assembleru používajícího AT&T syntax (který ovšem na požádání také umí Intel syntax). Hlavním rozdílem mezi těmito syntaxemi je pořadí operandů instrukce a způsob zápisu dereference. Na rozdíl od GNU Assembleru je určen pro programování, zatímco GNU Assembler byl koncipován pouze pro strojový překlad v pozadí GCC a nepočítalo se s přímým používáním.

Jeho součástí je poměrně silný makrojazyk optimalizovaný pro potřeby assembleru (zatímco GNU Assembler makrojazyk nemá a maximálně umožňuje použít preprocesor C). Makrojazyk NASM je ovšem trochu komplikovaný a ne vždy zcela konzistentní. Jeho makrojazyk je stejně silný, ne-li silnější, než makrojazyk MASM, ovšem na rozdíl od MASM má NASM komplikovanější a zamotanější syntaxi u svého makrojazyka.

NASM také má možnost generovat do výsledného zkompilovaného souboru i ladící informace, ale tato možnost není ještě v NASM plně implementována. V současné době podporuje tuto možnost pouze u elf formátu a obj formátu pro Borland překladače.

NASM byl historicky prvním kompilátorem assembleru, který nabídl širokou použitelnost spolupráce s mnoha kompilátory, a také přenositelnost na mnoho platforem. Vzhledem k výhodám, které nabízí jeho licence a k výhodám, které vznikly v důsledku toho, že je napsán v programovacím jazyce C se stal velmi široce rozšířeným assemblerovským kompilátor v open source světě. Tím se stal také široce testovaným a prověřeným.

Příklad syntaxe
mov al,[es:esi] ; Do registru al uloží hodnotu na adrese es:esimov eax,label ; Do registru eax se uloží offset návěští labelpush cs ; Zkopírování selektoru cs do dspop dsmov eax,[label] ; Do registru eax se uloží hodnota na offsetu ds:label, tedy 1234hmov ax,4C00h ; Ukončení aplikace v MS-DOS/Windowsint 21hlabel: dd 1234h

Hello world

Hello world pro DOS.

SECTION .textorg 0x100mov ah, 0x9mov dx, helloint 0x21mov ah, 0x4cmov al, 0int 0x21SECTION .datahello DB "Hello, world!",0xd,0xa,'$'

Hello world pro Windows.

%include 'WIN32N.INC'EXTERN MessageBoxAImport MessageBoxA user32.dllEXTERN ExitProcessImport ExitProcess kernel32.dllSECTION CODE USE32 CLASS=CODE..start:push UINT MB_OKpush LPCTSTR titlepush LPCTSTR bannerpush HWND NULLcall [MessageBoxA]push UINT NULLcall [ExitProcess]SECTION DATA USE32 CLASS=DATAbanner db 'Hello, world!',0xD,0xA,0title db 'Hello',0

Hello world pro Linux.

 SECTION .data  msg db "Hello, world!",0xa    len equ $ - msg SECTION .text  global main main:  mov eax, 4  mov ebx, 1  mov ecx, msg  mov edx, len  int 0x80  mov eax, 1  mov ebx, 0        int 0x80

Externí odkazy