๐Ÿ‘‹ NASM์œผ๋กœ Hello World ์ถœ๋ ฅํ•˜๊ธฐ

๋ฐฐ์ฃผ์›…ยท2020๋…„ 8์›” 30์ผ
1
post-thumbnail

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์ด๋ผ๊ณ  ํ•œ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ˜์†” ์ฐฝ ์ถœ๋ ฅ ๋˜ํ•œ 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์„ ํ˜ธ์ถœํ•œ๋‹ค.

โ˜๏ธ ์ฒซ๋ฒˆ์งธ System call, ์ถœ๋ ฅ

    mov rax, 0x02000004 
    mov rdi, 1 
    mov rsi, message 
    mov rdx, 13
    syscall 

sys_write ์‹๋ณ„์ž ์ง€์ •

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” system call์€ write ์ด๊ณ , ์ด๋Š” 4๋ผ๋Š” ์‹๋ณ„์ž๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์–ด๋–ค system call์„ ์‹คํ–‰ํ•  ์ง€๋Š” %rax ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— %rax ์— 0x0200004 ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค. ( Mac OS์—์—์„œ๋Š” ์‹๋ณ„์ž์— 0x02000000 ๋ฅผ ๋”ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค )

File Descriptor ์ง€์ •

์ฝ˜์†” ์ฐฝ ์ถœ๋ ฅ ( STDOUT )์„ ํ•˜๊ณ  ์‹ถ์œผ๋ฏ€๋กœ, POSIX FD์— ์˜๊ฑฐํ•˜์—ฌ ๊ฐ’ 1์„ ์ง€์ •ํ•œ๋‹ค. ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ๋Š” %rdi ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Buffer์™€ ํฌ๊ธฐ ์ง€์ •

Hello, World๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์œผ๋ฏ€๋กœ "Hello, World" ๊ฐ’์„ ์ง€์ •ํ•œ๋‹ค. ์‚ฌ์ด์ฆˆ๋Š” 13์„ ์ง€์ •ํ•œ๋‹ค. ๋‘๋ฒˆ์งธ์™€ ์„ธ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ๋Š” ๊ฐ๊ฐ %rsi, %rdx ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋‚˜๋จธ์ง€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋“ค์€?

%rcx , %r8 , %r9 ๋“ฑ์ด ๊ฐ๊ฐ 4๋ฒˆ์งธ, 5๋ฒˆ์งธ, 6๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ด์šฉ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•„์š”ํ•œ ๊ฐ’์„ ์ง€์ • ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•œ ํ›„ syscall ์„ ํ˜ธ์ถœํ•˜๋ฉด Hello, World ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

โœŒ๏ธ ๋‘๋ฒˆ์งธ System call, ์ข…๋ฃŒ

    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

์ด ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋ฉด ์›ํ™œํžˆ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.

profile
๊ณต๋ถ€ํ•˜์ž ๋จน๊ณ ์‚ด์ž ์˜ค๋Š˜๋„ ๋ฐฉ์‹ค๋ฐฉ์‹ค ๋ฐ์€ ๋Œ€ํ•œ๋ฏผ๊ตญ์˜ ํ•˜๋Š˜

0๊ฐœ์˜ ๋Œ“๊ธ€