맨위로가기

넷와이드 어셈블러

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

넷와이드 어셈블러(NASM)는 여러 바이너리 형식을 지원하는 x86 아키텍처용 어셈블러이다. 다양한 운영 체제 및 아키텍처에서 사용될 수 있는 플랫 바이너리 파일을 생성할 수 있으며, 인텔 어셈블리 구문을 사용한다. NASM은 COFF, OMF, a.out, ELF, Mach-O, 바이너리 파일(.bin) 등 다양한 바이너리 형식을 출력할 수 있으며, 자체 바이너리 형식인 RDOFF도 지원했으나 현재는 사용 중단되었다. NASM은 1996년에 처음 출시되었으며, x86-64 확장을 지원하고 BSD 라이선스 하에 배포된다.

더 읽어볼만한 페이지

  • 어셈블러 - 터보 어셈블러
    볼랜드에서 개발한 터보 어셈블러는 빠른 속도와 MASM과의 높은 호환성을 특징으로 하며, 어셈블리 프로그래밍 입문자를 위한 튜토리얼과 샘플 코드를 제공하지만, 참조 문서 부족은 단점으로 지적되었다.
  • 어셈블러 - 마이크로소프트 매크로 어셈블러
    마이크로소프트 매크로 어셈블러(MASM)는 1981년 첫 출시 후 인텔 프로세서 명령어와 SIMD, MMX 명령어 지원을 추가하며 업데이트되어 왔고, 현재는 Visual Studio에 통합되어 다양한 IDE, 디버거, 디스어셈블러를 통해 개발 환경이 지원되는 x86 어셈블리 언어 개발 도구이다.
  • 역어셈블러 - OllyDbg
    OllyDbg는 32비트 디버거로, 리버스 엔지니어링, 소프트웨어 크래킹, 어셈블리 코드 편집, 프로그램 동작 확인, 악성코드 분석 등에 활용되며, 디스어셈블러 부분은 GNU GPL에 따라 자유 소프트웨어로 배포된다.
  • 역어셈블러 - 인터랙티브 디스어셈블러
    인터랙티브 디스어셈블러는 다양한 시스템, 프로세서, 컴파일러를 지원하는 디스어셈블 및 디버깅 도구로, IDC 스크립트를 통한 기능 확장과 다양한 스크립트 언어 및 디버깅 환경을 지원한다.
  • 자유 컴파일러와 인터프리터 - Tcl
    Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
  • 자유 컴파일러와 인터프리터 - PHP
    PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
넷와이드 어셈블러 - [IT 관련 정보]에 관한 문서
기본 정보
NASM 로고
NASM 로고
저자사이먼 테이텀, 줄리안 홀
개발자H. 피터 앤빈, 창석배, 짐 쿠쿠나스, 프랭크 B. 코틀러, 시릴 고르쿠노프
최초 출시일1996년 10월
최신 버전2.13.03
최신 버전 출시일2018년 2월 20일
프로그래밍 언어어셈블리어, C
운영 체제유닉스 계열, 윈도우, OS/2, MS-DOS
종류x86 어셈블러
언어영어
라이선스BSD 2-clause
웹사이트NASM 공식 웹사이트

2. 기능

NASM은 다양한 기능을 제공하여 개발자가 효율적으로 어셈블리 프로그래밍을 할 수 있도록 지원한다. 주요 기능 중 하나는 여러 종류의 바이너리 파일 형식을 지원하여[5], 작성된 프로그램을 거의 모든 x86 운영 체제(OS)로 리타겟팅할 수 있다는 점이다.[5] 또한 부팅 로더나 읽기 전용 메모리(ROM) 이미지 제작 등 시스템 프로그래밍에 유용한 플랫 바이너리 파일 생성도 가능하다.[5]

NASM은 크로스 어셈블러로도 작동하여 PowerPC나 SPARC 같은 비 x86 플랫폼에서도 실행될 수 있지만, 해당 플랫폼용 코드를 직접 생성하지는 않는다. 문법적으로는 인텔 어셈블리 구문 기반의 독자적인 형식을 사용한다.[6][5]

2. 1. 지원 파일 형식

NASM은 다양한 바이너리 파일 형식을 지원하여 폭넓은 호환성을 제공한다.[5] 지원하는 주요 형식은 다음과 같다.

  • COFF
  • OMF
  • a.out
  • ELF
  • Mach-O
  • 바이너리 파일 (.bin): 운영 체제 컴파일이나 바이너리 디스크 이미지 생성 등에 사용된다.


이처럼 다양한 출력 형식을 지원하기 때문에, NASM으로 작성된 프로그램은 사실상 거의 모든 x86 운영 체제(OS)에서 실행되도록 리타겟팅할 수 있다.[5] 또한, 부팅 로더, ROM 이미지 제작, 운영 체제 개발 등 다양한 용도로 활용될 수 있는 플랫 바이너리 파일 생성도 가능하다.[5] 다만, 위치 독립 코드(PIC)는 ELF 오브젝트 파일 형식에서만 지원된다.[5]

과거 NASM은 RDOFF(Relocatable Dynamic Object File Format)라는 자체 바이너리 형식도 가지고 있었다.[5] RDOFF는 NASM 개발자들이 오브젝트 파일 출력 기능의 무결성을 테스트하기 위해 만들어 사용한 형식이다.[7] 기본적으로 헤더와 실행 코드 또는 데이터를 담는 섹션 배열로 구성되며, NASM의 내부 구조를 기반으로 한다.[7] NASM 배포판에는 RDOFF 형식을 사용하기 위한 링커와 로더 같은 도구들도 포함되어 있었다.

RDOFF는 역사적으로 몇 차례 변화를 겪었다. NASM이 1996년 10월 버전 0.90을 출시할 때까지는 플랫 형식 실행 파일(MS-DOS COM 파일 등)만 지원했다. 버전 0.90에서 사이먼 테텀이 객체 파일 출력 인터페이스와 16비트 코드용 DOS .OBJ 파일 지원을 추가했지만,[8] 여전히 32비트 객체 형식은 지원하지 않았다. 이 문제를 해결하고 객체 파일 인터페이스를 익히기 위해 개발자 줄리안 홀(Julian Hall)이 RDOFF의 첫 버전을 만들어 NASM 버전 0.91에 처음 포함시켰다.[8] 초기 RDOFF(RDOFF1)는 'text', 'data', 'bss'(초기화되지 않은 데이터) 세 개의 세그먼트만 지원했다.[1] 이후 각 헤더 레코드에 길이 표시자를 추가하여[9] 형식을 모르는 레코드를 건너뛸 수 있게 하고, 여러 세그먼트를 지원하도록 업데이트되었다.

그러나 RDOFF 형식은 현재 사용 중단(deprecated)되었으며, NASM 버전 2.15.04부터는 지원이 비활성화되었다.

2. 2. 문법

NASM은 AT&T 구문 대신 인텔 어셈블리 구문의 변형을 사용한다.[6] 또한 MASM 및 호환 어셈블러에서 사용되는 세그먼트 오버라이드 자동 생성(및 관련 ASSUME 지시문)과 같은 기능을 사용하지 않는다.[5]

3. 운영 체제별 프로그램의 예

넷와이드 어셈블러(NASM)는 도스, 마이크로소프트 윈도우, 리눅스, OS X 등 다양한 운영 체제에서 실행 가능한 코드를 생성할 수 있다. 각 운영 체제 환경에 맞춰 시스템 호출이나 API를 사용하는 방식으로 프로그램을 작성하며, 아래 하위 섹션들에서 각 운영 체제별 NASM 프로그램의 간단한 예시를 확인할 수 있다.

3. 1. 도스 (DOS)

아래는 도스(DOS) 운영 체제를 위한 "Hello, world!" 프로그램 예제이다.

```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, '$'

3. 2. 마이크로소프트 윈도우 (Microsoft Windows)

비슷한 프로그램으로 마이크로소프트 윈도우용의 예는 다음과 같다:

```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

3. 3. 리눅스 (Linux)

리눅스용으로는 다음과 같다:



global _start

section .text

_start:

mov eax, 4 ; 시스템 콜 번호 (sys_write)

mov ebx, 1 ; 파일 디스크립터 1 (stdout)

mov ecx, msg ; 출력할 문자열 주소

mov edx, msg.len ; 문자열 길이

int 0x80 ; 커널 인터럽트 호출 (write(stdout, msg, msg.len))

mov eax, 1 ; 시스템 콜 번호 (sys_exit)

mov ebx, 0 ; 종료 코드 0

int 0x80 ; 커널 인터럽트 호출 (exit(0))

section .data

msg: db "Hello, world!", 10 ; 출력할 문자열 (10은 개행 문자 LF)

.len: equ $ - msg ; 문자열 길이 계산


3. 4. OS X

아래는 애플 OS X용 64비트 프로그램의 하나로, 키 입력을 받아 화면에 표시하는 예제이다.

```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

4. 개발

넷와이드 어셈블러(NASM)는 1996년 10월 버전 0.90 출시를 시작으로 개발되었다.[4] 이후 꾸준한 개발을 통해 2007년 11월에는 버전 2.00이 출시되어 x86-64 아키텍처 지원이 추가되는 중요한 변화를 맞이했다.[11][3] 초기에는 LGPL 라이선스를 따랐으나, 2009년 7월 버전 2.07부터는 보다 완화된 (2-조항) BSD 라이선스로 변경하여 배포되고 있다. 이러한 라이선스 변경은 New BSD License 하에 개발된 Yasm의 등장과도 관련이 있다. NASM의 개발 버전은 소스포지 대신 프로젝트 자체의 Git 저장소(GitHub)에서 관리되며, 바이너리 스냅샷은 프로젝트 웹 페이지를 통해 제공된다.[11][3] 또한, NASM 관련 문서를 쉽게 찾아볼 수 있는 검색 엔진도 제공된다.[13]

4. 1. 초기 개발

NASM 버전 0.90은 1996년 10월에 출시되었다.[4]

4. 2. 버전 2.00

2007년 11월 28일에 버전 2.00이 출시되었으며, 이 버전부터 x86-64 확장을 지원하게 되었다.[11][3] 개발 버전은 SourceForge.net에는 업로드되지 않지만, 프로젝트의 Git 저장소(GitHub)에서 관리되며, 바이너리 스냅샷은 프로젝트 웹 페이지를 통해 제공된다.

4. 3. 라이선스

NASM은 초기에 LGPL 라이선스로 배포되었다. 그러나 2009년 7월, 버전 2.07부터 단순화된 (2-조항) BSD 라이선스 하에 출시되기 시작했다. 이러한 라이선스 정책 변경은, 기존 LGPL 라이선스 하에서 개발되던 NASM과 달리 New BSD License를 채택하여 완전히 새로 작성된 Yasm의 개발에 영향을 미쳤다. Yasm은 NASM보다 먼저 x86-64 아키텍처를 지원했으며, GNU Assembler 구문 지원 기능도 추가했다.

4. 4. 개발 버전

개발 버전은 소스포지에 업로드되지 않는다.[11][3] 대신 프로젝트의 GitHub 저장소에서 확인할 수 있으며, 프로젝트 웹 페이지에서는 바이너리 스냅샷을 제공한다.[11][3]

5. RDOFF

RDOFF(Relocatable Dynamic Object File Formateng)는 NASM 개발자들이 NASM의 오브젝트 파일 출력 기능을 테스트하기 위해 사용하는 자체 바이너리 형식이다.[14][7] 이는 NASM이 COFF, OMF, a.out, ELF, Mach-O, 플랫 바이너리 파일 등 다양한 출력 형식을 지원하는 것과는 별개로 존재하는 NASM 고유의 형식이다.[5]

RDOFF는 NASM의 내부 구조에 기반을 두고 있으며,[14] 초기에는 NASM에 32비트 객체 형식이 없던 문제를 해결하고 개발자들이 객체 파일 인터페이스를 익히기 위한 목적으로 만들어졌다.[8] RDOFF 형식을 사용하는 링커로더 등의 도구도 NASM 배포판에 포함되어 있었다.[14][7]

그러나 RDOFF 형식은 현재 강력하게 사용 중단되었으며, NASM 2.15.04 버전부터는 지원이 비활성화되었다.

5. 1. RDOFF의 구조

RDOFF(Relocatable Dynamic Object File Formateng)는 개발자들이 NASM의 오브젝트 파일 출력 기능을 테스트하기 위해 사용하는 형식이다. 이 형식은 상당 부분 NASM의 내부 구조에 기반을 두고 있으며,[7] 기본적으로 두 부분으로 구성된다. 첫째는 출력 드라이버 함수 호출의 직렬화를 포함하는 헤더이고, 둘째는 실행 가능한 코드나 데이터를 담는 섹션 배열이다.[7] RDOFF 형식을 사용하는 링커로더와 같은 도구들은 NASM 배포판에 포함되어 있다.[7]

RDOFF 형식은 초기 버전 이후 한 차례 주요 업데이트가 있었다. 이 업데이트에서는 각 헤더 레코드에 길이 표시자를 추가하여[9] 프로그램이 알 수 없는 레코드를 건너뛸 수 있게 했고, 여러 세그먼트를 지원하도록 개선되었다. 초기 버전인 RDOFF1은 ''text''(코드), ''data''(초기화된 데이터), ''bss''(초기화되지 않은 데이터)라는 세 개의 세그먼트만 지원했다.[1]

현재 RDOFF 형식은 사용이 강력히 권장되지 않으며, NASM 버전 2.15.04부터는 비활성화되었다.

5. 2. RDOFF 관련 도구

RDOFF 포맷을 사용하는 도구들, 예를 들어 링커로더,는 NASM 배포판에 포함되어 있다.[14][7] 그러나 RDOFF 형식 자체는 현재 강력하게 사용 중단되었으며, NASM 2.15.04 버전부터는 비활성화되었다.

5. 3. RDOFF의 발전

1996년 10월 NASM 버전 0.90이 출시될 때까지, NASM은 MS-DOS COM 파일과 같은 플랫 형식 실행 파일만 지원했다.[8] 버전 0.90에서 사이먼 테텀은 객체 파일 출력 인터페이스와 16비트 코드용 DOS .OBJ 파일 지원 기능을 추가했다.[8]

그러나 NASM에는 여전히 32비트 객체 형식이 없었다. 이 문제를 해결하고 객체 파일 인터페이스를 익히기 위해 개발자 줄리안 홀은 RDOFF(Relocatable Dynamic Object File Format)의 첫 번째 버전을 만들었다. 이 RDOFF 버전은 NASM 버전 0.91에 처음 포함되었다.[8] RDOFF는 개발자들이 NASM의 객체 파일 출력 기능의 무결성을 테스트하는 데 사용되었으며, NASM의 내부 구조에 기반을 두고 있다.[7]

초기 RDOFF 버전(RDOFF1)은 ''text''(코드), ''data''(초기화된 데이터), ''bss''(초기화되지 않은 데이터)라는 세 개의 세그먼트만 지원했다.[1] 이후 RDOFF 형식은 한 차례 주요 업데이트를 거쳤다. 각 헤더 레코드에 레코드 길이 표시자를 추가하여[9] 형식을 모르는 레코드를 건너뛸 수 있게 하고, 여러 세그먼트를 지원하도록 개선되었다.[1]

RDOFF 형식은 현재 사용이 중단되었으며, NASM 2.15.04 버전부터는 비활성화되었다.

5. 4. 현재 상태

RDOFF 형식은 강력하게 사용 중단되었으며 NASM 2.15.04부터 비활성화되었다.

참조

[1] 웹사이트 NASM, the Netwide Assembler https://github.com/n[...] 2021-10-25
[2] 웹사이트 Linux assemblers: A comparison of GAS and NASM http://www.ibm.com/d[...]
[3] 웹사이트 The Netwide Assembler http://nasm.sourcefo[...] 2008-06-27
[4] 웹사이트 NASM Version History https://www.nasm.us/[...] 2019-08-03
[5] 웹사이트 NASM Manual http://alien.dowling[...] 2009-08-15
[6] 웹사이트 NASM: The Netwide Assembler http://webster.cs.uc[...] 2008-06-27
[7] 웹사이트 NASM Manual Ch. 6 http://nasm.sourcefo[...] 2008-06-27
[8] 웹사이트 NASM CVS http://nasm.cvs.sour[...] 2008-06-08
[9] 웹사이트 V1-V2.txt http://nasm.cvs.sour[...] 2002-12-04
[10] 웹인용 Linux assemblers: A comparison of GAS and NASM http://www.ibm.com/d[...]
[11] 웹인용 The Netwide Assembler http://nasm.sourcefo[...] 2008-06-27
[12] 웹인용 NASM Version History http://www.nasm.us/d[...] 2009-07-19
[13] 웹인용 NASM Doc Search Engine http://alien.dowling[...] 2009-09-14
[14] 웹인용 NASM Manual Ch. 6 http://nasm.sourcefo[...] 2008-06-27



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com