Netwide Assembler (NASM) —асемблер ідизасемблер для архітектуриx86. Може використовуватися для написання 16-,32- і 64-бітних програм. NASM вважається одним із найпопулярніших асемблерів дляLinux.
NASM може працювати на платформах, відмінних від x86, таких якSPARC іPowerPC, проте код він генерує лише для x86 і x86-64[3].
NASM може компілювати у декілька бінарних форматів, зокремаCOFF,Portable Executable,a.out,ELF іMach-O. NASM також має свій власний бінарний формат під назвоюRDOFF.
Така велика кількість підтримуваних бінарних форматів дозволяє кросс-компіляцію для абсолютної більшості систем на платформі x86. Крім того, NASM може створювати плоскі бінарні файли, що дозволяє написання завантажувальника ОС, образи ROM і фактично будь-яку частину операційної системи.
NASM успішно конкурує зі стандартним в Linux і багатьох інших UNIX-системах асемблеромgas[4]. Вважається, що якість документації у NASM вище, ніж у gas. Крім того, асемблер gas використовуєсинтаксис AT&T, в той час як NASM використовує варіант традиційного для x86-асемблерасинтаксису Intel; Intel-синтаксис використовується всіма асемблерами для Windows, наприкладMASM,TASM,FASM.
NASM був створений Саймоном Тетгемом спільно з Джуліаном Голом і в наш час[коли?] розвивається невеликою командою розробників наSourceForge.net. Спочатку він був випущений за умовами власної ліцензії, але пізніше вона була замінена наGNU LGPL. Починаючи з версії 2.07 ліцензія замінена на «спрощену BSD» (BSD з 2 пунктів).
ПрограмаHello World для операційної системиDOS.
section.textorg0x100movah,0x9movdx,helloint0x21movax,0x4c00int0x21section.datahello:db'Hello,world!',13,10,'$'
Подібна програма дляMicrosoft Windows.
global_startextern_MessageBoxA@16extern_ExitProcess@4sectioncodeuse32class=code_start:pushdword0; UINT uType = MB_OKpushdwordtitle; LPCSTR lpCaptionpushdwordbanner; LPCSTR lpTextpushdword0; HWND hWnd = NULLcall_MessageBoxA@16pushdword0; UINT uExitCodecall_ExitProcess@4sectiondatause32class=databanner:db'Hello,world!',0title:db'Hello',0
Аналог дляLinux.
section.datamsg:db"Hello,world!",10.len:equ$-msgsection.textglobal_start_start:moveax,4; writemovebx,1; stdoutmovecx,msgmovedx,msg.lenint0x80moveax,1; exitmovebx,0int0x80
NASM, is an 80x86 and x86-64 assembler