넷와이드 어셈블러
넷와이드 어셈블러(Netwide Assembler, NASM)은 인텔 x86 아키텍처용 어셈블러이자 역어셈블러이다. 16비트, 32비트(IA-32), 64비트(x86-64) 프로그램 작성에 사용할 수 있다. NASM은 가장 대중적인 리눅스용 어셈블러들 가운데 하나로 인식된다.[1]
원저자 | Simon Tatham, 줄리안 홀 |
---|---|
개발자 | H. Peter Anvin 등 |
안정화 버전 | 2.13.03
/ 2018년 2월 20일 |
저장소 | |
운영 체제 | 윈도우, 유닉스 계열, OS/2, OS X, 도스 |
언어 | 영어 |
종류 | x86 어셈블러 |
라이선스 | BSD 2-clause |
웹사이트 | www |
NASM은 원래 줄리안 홀(Julian Hall)의 도움을 받아 Simon Tatham에 의해 작성되었다. 2016년 기준으로, H. Peter Anvin이 주도하는 조그마한 팀에 의해 유지보수되고 있다.[2] 단순화된 (2-clause) BSD 라이선스 조항에 의거하여 출시되는 오픈 소스 소프트웨어이다.[3]
운영 체제별 프로그램의 예
편집아래는 도스용 운영 체제를 위한 헬로 월드 프로그램이다.
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, '$'
비슷한 프로그램으로 마이크로소프트 윈도우용의 예는 다음과 같다:
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
리눅스용으로는 다음과 같다:
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
아래는 애플 OS X용 64비트 프로그램의 하나로, 키 입력을 받아 화면에 표시하는 부분이다
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
개발
편집2007년 11월 28일, 버전 2.00이 출시되었으며 x86-64 확장 지원을 추가하였다.[2] 개발 버전들은 소스포지에 업로드되지 않지만, 프로젝트 웹 페이지에서 이용 가능한 바이너리 스냅샷을 포함하여 프로젝트 자체의 Git 저장소에서 검진된다.
NASM 문서의 검색 엔진 또한 이용이 가능하다.[4]
2.07 버전의 NASM은 단순화된 (2-clause) BSD 라이선스 하에서 배포된다.
RDOFF
편집RDOFF(Relocatable Dynamic Object File Format)는 개발자들이 NASM의 오브젝트 파일 출력 속성을 테스트하는 목적으로 사용된다. 상당 부분 NASM의 내부 구조에 기반을 두고 있으며[5] 필수적으로 출력 드라이버 함수 호출과 실행 가능한 코드나 데이터를 포함하는 섹션 배열의 직렬화를 포함하는 헤더로 이루어져 있다. 링커와 로더를 포함한, 이 포맷을 사용하는 도구들은 NASM 배포판에 포함되어 있다.
같이 보기
편집각주
편집- ↑ Ram Narayan. “Linux assemblers: A comparison of GAS and NASM”. 2013년 10월 3일에 원본 문서에서 보존된 문서.
two of the most popular assemblers for Linux, GNU Assembler (GAS) and Netwide Assembler (NASM)
- ↑ 가 나 “The Netwide Assembler”. 2008년 6월 27일에 확인함.
- ↑ “NASM Version History”. 2009년 7월 19일에 확인함.
- ↑ “NASM Doc Search Engine”. 2010년 1월 23일에 원본 문서에서 보존된 문서. 2009년 9월 14일에 확인함.
- ↑ “NASM Manual Ch. 6”. 2008년 6월 27일에 확인함.
참고 문헌
편집- Jeff Duntemann (2000). 《Assembly Language Step by Step》. J Wiley and Sons. ISBN 0-471-37523-3.
외부 링크
편집- 넷와이드 어셈블러 - 공식 웹사이트
- (영어) 넷와이드 어셈블러 - SourceForge.net
- Win32 및 BeOS용 특별판
- GAS와 NASM 비교 - IBM
이 글은 소프트웨어에 관한 토막글입니다. 여러분의 지식으로 알차게 문서를 완성해 갑시다. |