Hello World๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ง๋ง, ์ฝ๋๊ฐ ์ด์ ๋ธ๋ฆฌ์ด๋ก ์์ฑ๋์๋ค๋ฉด ์ด์ผ๊ธฐ๊ฐ ๋ค๋ฅด๋ค. ์ต๊ทผ ์งํํ๋ ์คํฐ๋ ๋ด์ฉ์ ๋์ฑ ์ ์ดํดํ๊ธฐ ์ํด์ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฐพ์๋ณด๊ณ ์๋๋ฐ, ๋ด๋ ์ดํด๊ฐ ์ ์๋์ด์ ๋ฏ์ด ๋ณด๊ธฐ๋ก ํ๋ค.
ํด๋น ์ค์ต์ MacOS 10.15.4 ( Catalina ) ์์ ์งํ๋์๋ค.
global
: ํน์ ์ฌ๋ณผ์ global๋ก ์ ์์ด์ ๋ธ๋ฆฌ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ฝ๋๊ฐ private์ด๋ค. ์ด๋ ๋ค๋ฅธ ๋ชจ๋์ด ํด๋น ์ฝ๋์ ์ ๊ทผํ ์ ์๊ฒ ํ๊ธฐ ์ํด์ global instruction์ ์ด์ฉํ์ฌ ์ฌ๋ณผ์ ๋ค๋ฅธ ์ฝ๋๊ฐ ์ ๊ทผํ ์ ์๋๋ก ํด ์ค๋ค. ์ด๋ ๊ฒ ๋ช ์ํ์ง ์๋๋ค๋ฉด ๋ง์ปค์์ ์๋ฌด๋ฐ ์ฌ๋ณผ์ ์ฐพ์ ์ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
section
: ์น์
์ ์ ์์น์
์ ์ ์ํ๋๋ฐ, .text
์น์
์ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๊ธฐ ์ ์ฉ **์ฝ๋, ์ฆ ์คํ ๊ฐ๋ฅํ ์ฝ๋**๊ฐ ๋ค์ด๊ฐ๋ค. ์ค์ ๋ก IA32e ( Intel์ x86-64 ๋ชจ๋ ) ์์๋ ํด๋น ์น์
์ ์์ ํ ์ ์๋ค.
์ ์ ๋ณด๋ฅผ ํ ๋๋ก, ์ฐ๋ฆฌ๋ start
์ฌ๋ณผ ์์ ์๋ ์ฝ๋๊ฐ Hello World๋ฅผ ์ถ๋ ฅํ ๊ฒ์ ์ ์ถํ ์ ์๋ค.
_main
์ฌ๋ณผ์ ์ฝ๋ ํบ์๋ณด๊ธฐ_main:
mov rax, 0x02000004
mov rdi, 1
mov rsi, message
mov rdx, 13
syscall
mov rax, 0x02000001
xor rdi, rdi
syscall
๋ญ๊ฐ syscall
๋ช
๋ น์ด๋ฅผ ๊ธฐ์ ์ผ๋ก ๋๋๋ ๊ฑฐ ๊ฐ์ผ๋, syscall
์ด ๋ฌด์์ธ์ง ์์๋ณด์.
์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ์๋ํ๋๋ฐ, ํด๋น ๊ณต๊ฐ์์๋ ํน์ ํ ๋ช ๋ น์ด ์คํ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ด ๋ ํ์ผ ์ ์ถ๋ ฅ๊ณผ ๊ฐ์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋์์ ์ํํ๊ธฐ ์ํด์๋ ์ปค๋์ ์์กดํ์ฌ์ผ ํ๋ค. ์ด ๋ ์ปค๋์ ์ํ๋ ์์ฒญ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ system call์ด๋ผ๊ณ ํ๋ค.
์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ ํ๋ ์ฝ์ ์ฐฝ ์ถ๋ ฅ ๋ํ system call์ ์ด์ฉํด์ผ ํ๋ค. Mac OS x86-64์ System Call ํ
์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์๋ฐ, ์ฐ๋ฆฌ๊ฐ ์จ์ผ ํ๋ ๊ฑด sys_write
์ sys_exit
์ด ๋๊ฐ์ง์ด๋ค.
1 AUE_EXIT ALL { void exit(int rval) NO_SYSCALL_STUB; }
4 AUE_NULL ALL { user_ssize_t write(int fd, user_addr_t cbuf, user_size_t nbyte); }
syscall
๋ช
๋ น์ ํ์ฌ ๋ ์ง์คํฐ์ ๋ด๊ฒจ ์๋ ๊ฐ์ ํ ๋๋ก ์๋ง์ system call์ ํธ์ถํ๋ค.
mov rax, 0x02000004
mov rdi, 1
mov rsi, message
mov rdx, 13
syscall
์ฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๋จผ์ ์คํํ๊ณ ์ ํ๋ system call์ write
์ด๊ณ , ์ด๋ 4๋ผ๋ ์๋ณ์๋ฅผ ๊ฐ๊ณ ์๋ค. ์ด๋ค system call์ ์คํํ ์ง๋ %rax
๋ ์ง์คํฐ๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ %rax
์ 0x0200004 ๊ฐ์ ๋ฃ์ด์ค๋ค. ( Mac OS์์์๋ ์๋ณ์์ 0x02000000 ๋ฅผ ๋ํด ์ฃผ์ด์ผ ํ๋ค )
์ฝ์ ์ฐฝ ์ถ๋ ฅ ( STDOUT )์ ํ๊ณ ์ถ์ผ๋ฏ๋ก, POSIX FD์ ์๊ฑฐํ์ฌ ๊ฐ 1์ ์ง์ ํ๋ค. ์ฒซ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ก๋ %rdi
๋ฅผ ์ฌ์ฉํ๋ค.
Hello, World๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ์ผ๋ฏ๋ก "Hello, World" ๊ฐ์ ์ง์ ํ๋ค. ์ฌ์ด์ฆ๋ 13์ ์ง์ ํ๋ค. ๋๋ฒ์งธ์ ์ธ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ก๋ ๊ฐ๊ฐ %rsi
, %rdx
๋ฅผ ์ฌ์ฉํ๋ค.
%rcx
, %r8
, %r9
๋ฑ์ด ๊ฐ๊ฐ 4๋ฒ์งธ, 5๋ฒ์งธ, 6๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ด์ฉ๋๋ค.
์ด๋ ๊ฒ ํ์ํ ๊ฐ์ ์ง์ ๋ ์ง์คํฐ์ ์ ์ฅํ ํ syscall
์ ํธ์ถํ๋ฉด Hello, World ๋ฅผ ์ถ๋ ฅํ๋ค.
mov rax, 0x02000001
xor rdi, rdi
syscall
Exit 0์ ํ๊ณ ์ถ์ผ๋ฏ๋ก, sys_exit ์๋ณ์๋ฅผ %rax
์ ์ถ๊ฐํ ํ %rdi
๋ฅผ 0์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ ์ฝ๋์ด๋ค.
ํ์ฌ ์์ฑ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค. ์์ ์ฝ๋์ ๋์ผํ์ง๋ง ์ฌ๋ผ๊ฐ๊ธฐ ๊ท์ฐฎ์ผ๋ ํ๋ฒ ๋ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ ์ ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด ํด๋น ์ฝ๋๋ฅผ object ํ์ผ๋ก ๋ง๋ค ์ ์๋ค. ์ฐ๋ฆฌ๋ Mac OS 64๋นํธ ์ด์์ฒด์ ์ด๋ฏ๋ก -f
๋ฅผ ์ด์ฉํด macho64
๋ฅผ ์ง์ ํ์ฌ ์ค๋ค.
> nasm -f macho64 hello_world.asm
์ด ๋ช
๋ น์ด๋ฅผ ์ด์ฉํ๋ฉด hello_world.o
๋ชฉ์ ํ์ผ์ด ์์ฑ๋๋ค. ์ด ํ์ผ์ ์คํ ๊ฐ๋ฅํ ํ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด์๋ ๋งํฌ ๊ณผ์ ์ด ํ์ํ๋ค.
> ld -lSystem hello_world.o -o hello_world
์ด ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ๋ฉด ์ํํ ์คํ ๊ฐ๋ฅํ๋ค.