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.02 (4. 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:esi
mov eax,label ; Do registru eax se uloží offset návěští label
push cs ; Zkopírování selektoru cs do ds
pop ds
mov eax,[label] ; Do registru eax se uloží hodnota na offsetu ds:label, tedy 1234h
mov ax,4C00h ; Ukončení aplikace v MS-DOS/Windows
int 21h
label: dd 1234h

Hello world editovat

Hello world pro DOS.

SECTION .text
org 0x100
mov ah, 0x9
mov dx, hello
int 0x21
mov ah, 0x4c
mov al, 0
int 0x21
SECTION .data
hello DB "Hello, world!",0xd,0xa,'$'

Hello world pro Windows.

%include 'WIN32N.INC'
EXTERN MessageBoxA
Import MessageBoxA user32.dll
EXTERN ExitProcess
Import ExitProcess kernel32.dll
SECTION CODE USE32 CLASS=CODE
..start:
push UINT MB_OK
push LPCTSTR title
push LPCTSTR banner
push HWND NULL
call [MessageBoxA]
push UINT NULL
call [ExitProcess]
SECTION DATA USE32 CLASS=DATA
banner db 'Hello, world!',0xD,0xA,0
title 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 editovat