{{위키데이터 속성 추적}}
{{소프트웨어 정보
 | logo                   = Netwide Assembler.svg
 | author                 = [[Simon Tatham]], 줄리안 홀
 | developer              = [[H. Peter Anvin]] 등
 | latest release version = 2.13.03
 | latest release date    = {{시작 날짜와 나이|2018|2|20}}
 | operating system       = [[마이크로소프트 윈도우|윈도우]], [[유닉스 계열]], [[OS/2]], [[OS X]], [[도스]]
 | genre = [[x86 어셈블리어|x86]] [[어셈블리어|어셈블러]]
 | language               = [[영어]]
 | license                = [[BSD 라이선스|BSD 2-clause]]
 | website                = {{URL|www.nasm.us}}
}}

'''넷와이드 어셈블러'''(Netwide Assembler, NASM)은 [[인텔]] [[x86]] 아키텍처용 [[어셈블리어|어셈블러]]이자 [[역어셈블러]]이다. [[16비트]], [[32비트]]([[IA-32]]), [[64비트]]([[x86-64]]) 프로그램 작성에 사용할 수 있다. NASM은 가장 대중적인 [[리눅스]]용 어셈블러들 가운데 하나로 인식된다.<ref>{{웹 인용|url=http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html |title=Linux assemblers: A comparison of GAS and NASM |author=Ram Narayan |quote=two of the most popular assemblers for Linux, GNU Assembler (GAS) and Netwide Assembler (NASM) |url-status=dead |archiveurl=https://web.archive.org/web/20131003180256/http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html |archivedate=3 October 2013}}</ref>

NASM은 원래 줄리안 홀(Julian Hall)의 도움을 받아 [[Simon Tatham]]에 의해 작성되었다. 2016년 기준으로, [[H. Peter Anvin]]이 주도하는 조그마한 팀에 의해 유지보수되고 있다.<ref name="Homepage">{{웹 인용|url=http://nasm.sourceforge.net/|title=The Netwide Assembler|date=|accessdate=2008-06-27}}</ref> 단순화된 (2-clause) [[BSD 라이선스]] 조항에 의거하여 출시되는 [[오픈 소스 소프트웨어]]이다.<ref name="Changelog">{{웹 인용|url=http://www.nasm.us/doc/nasmdocc.html|title=NASM Version History|accessdate=2009-07-19}}</ref>

== 운영 체제별 프로그램의 예 ==
아래는 [[도스]]용 운영 체제를 위한 헬로 월드 프로그램이다.
<syntaxhighlight lang="nasm">
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, '$'
</syntaxhighlight>
비슷한 프로그램으로 [[마이크로소프트 윈도우]]용의 예는 다음과 같다:
<syntaxhighlight lang="nasm">
global _main
extern _MessageBoxA@16
extern _ExitProcess@4

section code use32 class=code
_main:
	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
</syntaxhighlight>
[[리눅스]]용으로는 다음과 같다:
<syntaxhighlight lang="nasm">
global _start

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

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

section .data
msg:	db	"Hello, world!", 10
.len:	equ	$ - msg
</syntaxhighlight>
아래는 애플 [[OS X]]용 64비트 프로그램의 하나로, 키 입력을 받아 화면에 표시하는 부분이다
<syntaxhighlight lang="nasm">
global _start

section .data

	query_string:		db	"Enter a character: "
	query_string_len:	equ	$ - query_string
	out_string:			db	"You have input: "
	out_string_len:		equ	$ - out_string

section .bss

	in_char:			resw 4

section .text

_start:

	mov	rax, 0x2000004 	; put the write-system-call-code into register rax
	mov	rdi, 1				; tell kernel to use stdout
	mov	rsi, query_string	; rsi is where the kernel expects to find the address of the message
	mov	rdx, query_string_len	; and rdx is where the kernel expects to find the length of the message
	syscall

	; read in the character
	mov	rax, 0x2000003		; read system call
	mov	rdi, 0				; stdin
	mov	rsi, in_char		; address for storage, declared in section .bss
	mov	rdx, 2				; get 2 bytes from the kernel's buffer (one for the carriage return)
	syscall

	; show user the output
	mov	rax, 0x2000004		; write system call
	mov	rdi, 1				; stdout
	mov	rsi, out_string
	mov	rdx, out_string_len
	syscall

	mov	rax, 0x2000004		; write system call
	mov	rdi, 1				; stdout
	mov	rsi, in_char
	mov	rdx, 2				; the second byte is to apply the carriage return expected in the string
	syscall

	; exit system call
	mov	rax, 0x2000001		; exit system call
        xor     rdi, rdi
	syscall
</syntaxhighlight>

== 개발 ==
2007년 11월 28일, 버전 2.00이 출시되었으며 [[x86-64]] 확장 지원을 추가하였다.<ref name="Homepage"/> 개발 버전들은 [[소스포지]]에 업로드되지 않지만, 프로젝트 웹 페이지에서 이용 가능한 바이너리 스냅샷을 포함하여 프로젝트 자체의 [[Git]] [[버전 관리|저장소]]에서 검진된다.

NASM 문서의 검색 엔진 또한 이용이 가능하다.<ref name="ManualSearch">{{웹 인용|url=http://alien.dowling.edu/~rohit/search/srch/search.php|title=NASM Doc Search Engine|date=|accessdate=2009-09-14|author=|보존url=https://web.archive.org/web/20100123001130/http://alien.dowling.edu/~rohit/search/srch/search.php|보존날짜=2010-01-23|url-status=dead}}</ref>

2.07 버전의 NASM은 단순화된 (2-clause) BSD 라이선스 하에서 배포된다.

== RDOFF ==
RDOFF(Relocatable Dynamic Object File Format)는 개발자들이 NASM의 오브젝트 파일 출력 속성을 테스트하는 목적으로 사용된다. 상당 부분 NASM의 내부 구조에 기반을 두고 있으며<ref name = "manual">{{웹 인용|url=http://nasm.sourceforge.net/doc/nasmdoc6.html|title=NASM Manual Ch. 6|date=|accessdate=2008-06-27|author=}}</ref> 필수적으로 출력 드라이버 함수 호출과 실행 가능한 코드나 데이터를 포함하는 섹션 배열의 [[직렬화]]를 포함하는 헤더로 이루어져 있다. 링커와 로더를 포함한, 이 포맷을 사용하는 도구들은 NASM 배포판에 포함되어 있다.

== 같이 보기 ==
* [[어셈블리어]]
* [[Yasm]]

== 각주 ==
{{각주|1}}

== 참고 문헌 ==
* {{서적 인용|title=Assembly Language Step by Step|author=Jeff Duntemann|publisher=J Wiley and Sons|year=2000|isbn=0-471-37523-3}}

== 외부 링크 ==
* {{공식 웹사이트}}
* {{소스포지|nasm}}
* [https://web.archive.org/web/20111016034545/http://www.realtech-vr.com/nasm/ Win32 및 BeOS용 특별판]
* [http://www.ibm.com/developerworks/linux/library/l-gas-nasm.html GAS와 NASM 비교] - [[IBM]]

{{토막글|소프트웨어}}

[[분류:어셈블러]]
[[분류:역어셈블러]]
[[분류:BSD 라이선스 소프트웨어]]
[[분류:자유 컴파일러와 인터프리터]]