Netwide Assembler (NASM) — асемблер і дизасемблер для архітектури x86. Може використовуватися для написання 16-,32- і 64-бітних програм. NASM вважається одним із найпопулярніших асемблерів для Linux.

NASM
Netwide Assembler.svg
Тип мова програмування і x86 assembly languaged
Розробник Hans Peter Anvind
Версії 2.14.02 (26 грудня 2018)
Репозиторій http://repo.or.cz/nasm.git, git://repo.or.cz/nasm.git
Операційна система крос-платформова програма
Написано на C[1]
Ліцензія 2-clause BSD licensed[2]
nasm.us

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 .text
org 0x100
	mov	ah, 0x9
	mov	dx, hello
	int	0x21

	mov	ax, 0x4c00
	int	0x21

section .data
hello:	db 'Hello, world!', 13, 10, '$'

Подібна програма для Microsoft Windows.

global _start
extern _MessageBoxA@16
extern _ExitProcess@4

section code use32 class=code
_start:
	push	dword 0 ; UINT uType = MB_OK
	push	dword title ; LPCSTR lpCaption
	push	dword banner ; LPCSTR lpText
	push	dword 0 ; HWND hWnd = NULL
	call	_MessageBoxA@16
 
	push	dword 0 ; UINT uExitCode
	call	_ExitProcess@4
 
section data use32 class=data
	banner:	db 'Hello, world!', 0
	title:	db 'Hello', 0

Аналог для Linux.

section .data
msg:	db	"Hello, world!", 10
.len:	equ	$ - msg

section .text
global _start
_start:
	mov	eax, 4 ; write
	mov	ebx, 1 ; stdout
	mov	ecx, msg
	mov	edx, msg.len
	int	0x80

	mov	eax, 1 ; exit
	mov	ebx, 0 
	int	0x80

ПриміткиРедагувати

  1. The nasm Open Source Project on Open Hub: Languages Page — 2006.
  2. http://www.nasm.us/
  3. 1.1 What Is NASM?. The Netwide Assembler: NASM. Офіційний сайт. Архів оригіналу за 2012-02-18. Процитовано 2010-07-14. «NASM, is an 80x86 and x86-64 assembler» 
  4. Ассемблеры для Linux: Сравнение GAS и NASM(рос.)