Netwide Assembler
|Netwide Assembler|
|Základné informácie|
|Autor||Simon Tatham, Julian Hall|
|Vývojár||H. Peter Anvin a ďalší|
|Operačný systém||Microsoft Windows, Unixové OS, OS/2, Mac OS, DOS|
|Dostupné jazyky||Anglický jazyk|
|Typ softvéru||x86 assembler|
|Licencia||2-klauzula BSD licencia|
|Ďalšie odkazy|
|Webová stránka||http://www.nasm.us/|


Pozri aj Informačný portál
Netwide Assembler (NASM) je multiplatformový kompilátor programovacieho jazyka assembler s podporou architektúry x86 a x84-64, a s podporou mnohých výstupných formátov. NASM podporuje všetky inštrukčné sady vrátane nedokumentovaných a vrátane špecifických inštrukcií niektorých procesorov. Okrem vlastného prekladača má aj veľmi obmedzený dissassembler s názvom ndisasm.
Výhodou NASM je možnosť spojiť ho s inými programovacími jazykmi na mnohých platformách a pod mnohými kompilátormi, bez toho aby ste museli svoje assemblerovské kódy prepisovať z dôvodu zmeny syntaxe. Podporuje napríklad Linuxové formáty ELF, a.out, ďalej Windowsové formáty COFF (používa GCC kompilátor a DJGPP kompilátor), win32 (Microsoftský formát používaný MS Visual Studiom pre 32 bitové prostredie), win64 (formát MS Visual Studia pre 64 bitové prostredie), formáty DOS (pre MS-DOS programy) a mnohé ďalšie.
NASM je šírený pod 2-klauzulou BSD licencie.
Priaznivým dôsledkom toho, že NASM je písaný kompletne v jazyku C, je, že je možné ho použiť a preložiť prakticky na ľubovolnú platformu. Je možné ho teda používať v DOSe, OS/2, Windows, Linuxe aj BSD. Na ďalšie platformy ho možno ľahko preložiť. Pracuje dokonca aj na platformách s inou architektúrou, než je x86 a x84-64, čím umožňuje aj krížový preklad na rozdiel od napríklad FASM, ktorý je písaný v assembleri, a krížový preklad neumožňuje, rovnako tak je omnoho ťažšie portovať ho na iné platformy.
Používa tradičný Intel syntax, na rozdiel od napríklad GNU Assemblera používajúceho AT&T syntax (ktorý však na požiadanie tiež vie Intel syntax). Hlavným rozdielom medzi týmito syntaxami je poradie operandov inštrukcie a spôsob zápisu dereferencie. Na rozdiel od GNU Assemblera je určený pre programovanie, zatiaľ čo GNU Assembler bol koncipovaný len pre strojový preklad v pozadí GCC a nepočítalo sa s priamym používaním.
Jeho súčasťou je pomerne silný makrojazyk optimalizovaný pre potreby assemblera (zatiaľ čo GNU Assembler makrojazyk nemá a maximálne umožňuje použiť len preprocesor C). Makrojazyk NASM je však trochu komplikovaný a nie vždy celkom konzistentný. Jeho makrojazyk nie je tak silný, ako napríklad makrojazyk MASM – ten však podporuje len MS Visual Studio a Windows.
NASM tiež má možnosť generovať do výsledného skompilovaného súboru aj ladiace informácie, ale táto možnosť nie je ešte v NASM plne implementovaná. V súčasnosti podporuje túto možnosť len pri elf formáte a obj formáte pre Borland prekladače.
NASM bol historicky prvým kompilátorom assemblera, ktorý ponúkol širokú použiteľnosť spolupráce s mnohými kompilátormi, a tiež prenositeľnosť na mnoho platforiem. Vzhľadom k výhodám, ktoré ponúka jeho licencia a k výhodám, ktoré vznikli v dôsledku toho, že je napísaný v programovacom jazyku C sa stal veľmi široko rozšíreným assemblerovským kompilátorom v open source svete. Tým sa stal tiež široko testovaným a prevereným.
- Príklad syntaxe
mov al,[es:esi] ; Do registru al uloží hodnotu na adrese es:esi mov eax,label ; Do registru eax sa uloží offset návestia label push cs ; Skopírovanie selektoru cs do ds pop ds mov eax,[label] ; Do registru eax sa uloží hodnota na offsete ds:label, teda 1234h mov ax,4C00h ; Ukončenie aplikácie v MS-DOS/Windows int 21h label: dd 1234h
Hello world[upraviť | upraviť zdroj]
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,'$'
%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
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