Netwide Assembler
넷와이드 어셈블러(Netwide Assembler, NASM)은 인텔 x86 아키텍처용 어셈블러이자 역어셈블러이다. 16비트, 32비트(IA-32), 64비트(x86-64) 프로그램 작성에 사용할 수 있다. NASM은 가장 대중적인 리눅스용 어셈블러들 가운데 하나로 인식된다.
NASM은 원래 줄리안 홀(Julian Hall)의 도움을 받아 Simon Tatham에 의해 작성되었다. 2016년 기준으로, H. Peter Anvin이 주도하는 조그마한 팀에 의해 유지보수되고 있다. 단순화된 (2-clause) BSD 라이선스 조항에 의거하여 출시되는 오픈 소스 소프트웨어이다.
How to install in Ubuntu
Hello, world
section .data ;섹션 .data 를 선언한다.(여기부터
; .data 섹션이다.)
msg db "Hello, world!",0xa ;출력할 사랑스런(!) 스트링이다.
len equ $ - msg ;친애하는(!) 문자열의 길이
section .text ;여기부터 .text 섹션이다. 코드있음
;ELF 링커나 로더에게 프로그램의 엔트리 포인트를 알려주어야
global _start ;한다. 로더 혹은 링커는 일반적으로 엔트리 포인트가 _start
;라고 가정하고 있다. 이 디폴트 설정을 바꿀려면,
;ld -e foo 를 사용하라.
_start:
;stdout 에 우리의 사랑스런 문자열을 출력하자.
mov edx,len ;시스템 콜 4번(sys_write)은 세번째 인수로 출력할 메세지의
;길이를 취한다.
mov ecx,msg ;시스템 콜 4번은 두번째 인수로 출력할 메세지가 담긴 메모리
;주소를 취한다. 즉, 출력할 메세지로의 포인터를 취한다.
mov ebx,1 ;시스템 콜 4번은 첫번째 인수로 파일의 핸들(디스크립터)을
;취한다.
mov eax,4 ;eax 레지스터에 호출할 커널 시스템 콜의 번호를 넣어 준다.
;이 경우에는 4번(sys_write) 이다.
int 0x80 ;커널을 호출한다.
;출력이 끝났으면, exit 를 호출한다.
mov ebx,0 ;exit 코드로 0을 준다. (c 코드로는 exit(0);)
mov eax,1 ;시스템 콜 1번 (sys_exit)
int 0x80 ;커널을 호출한다.
See also
Favorite site
- [추천] Programming from the Ground Up (ko)