[ASM] 어셈블리어란? 맥OS에서 Intel문법 + NASM으로 "hello world" 출력하기
42Seoul/그 외

[ASM] 어셈블리어란? 맥OS에서 Intel문법 + NASM으로 "hello world" 출력하기

어셈블리어(Assembly language)란?

"기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어" - 위키백과

프로그래밍 언어에는 C/C++과 같은 고급 언어(High-Level language) 외에도 어셈블리어기계어가 존재합니다.

 

먼저, 실제 컴퓨터 프로그램은 0과 1로만 이루어져 있는데, 이를 기계어라고 부릅니다. 그리고 어셈블리어는, 이런 기계어에 MOV, ADD와 같은 명령어를 각각 대응시킨, 프로그래밍의 저급 언어입니다. 컴퓨터 구조(CPU)마다 기계어가 다르기 때문에, 이에 대응하는 어셈블리어도 각각 달라지게 됩니다.

 

이러한 단점을 개선하기 위해 만들어진 것이 C언어와 같은 고급 언어로, CPU에 종속적이지 않으면서도, 저급 언어처럼 메모리에 직접 접근할 수 있다는 장점이 있습니다.

 

고급 언어(.c)  --컴파일러-->  어셈블리어(.s)  --어셈블러-->  기계어(.o)  --링커-->  실행 파일

고급 언어의 경우에는 프로그램을 실행하기까지 다음과 같은 과정을 거쳐야 합니다. 하지만 어셈블리어 파일은 이미 .s확장자를 가지고 있기 때문에, 바로 어셈블러를 거쳐 오브젝트 파일을 생성할 수 있습니다.

 

 


 

Intel문법으로 어셈블리어 코드 작성하기

어셈블리어의 문법은 크게 Intel문법과 AT&T문법으로 나누어집니다. 여기서는 Intel문법으로 코드를 작성하고, NASM으로 컴파일하도록 하겠습니다.

더보기

42서울에서는 https://github.com/kube/42homebrew 에서 homebrew 설치 후, brew install nasm으로 nasm을 설치

 

hello.s를 다음과 같이 작성합니다. 여기서 ;는 주석을 의미합니다.

section .data;data섹션
	msg db "hello world",0x0A;개행문자

section .text;text섹션
	global _main;전역에서 접근가능

_main :;메인함수
	mov rax, 0x2000004;맥OS의 syscall write()함수 번호. 아래는 매개변수
	mov rdi, 1
	mov rsi, msg
	mov rdx, 12
	syscall;호출
	mov rax, 0x2000001;맥OS의 syscall exit()함수. 아래는 매개변수
	mov rdi, 0
	syscall;호출

 

컴파일 및 실행

nasm -f macho64 hello.s
gcc -o hello hello.o
./hello

출력 결과

 

 

각 코드의 보다 자세한 설명은 다음 글 어셈블리어의 명령어에서 이어서 하겠습니다.