๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿฆพ ๋ณด์•ˆ ๐Ÿฆพ/๋ฆฌ๋ฒ„์‹ฑ

x86-64 ์–ด์…ˆ๋ธ”๋ฆฌ์–ด

๋ฐ˜์‘ํ˜•

์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(C, C++, JAVA, Python) ๋ณด๋‹ค ์ €์ˆ˜์ค€ ์–ธ์–ด๋กœ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ์–ธ์–ด.

์ข…๋ฅ˜ : IA-32(intel 32bit), x86-64, ARM, MIPS

์–ด์…ˆ๋ธ”๋ฆฌ์–ด(Assembly Language)

  • ๊ธฐ๊ณ„์–ด์™€ ์ผ๋Œ€์ผ ๋Œ€์‘์ด ๋˜๋Š” ์ €์ˆ˜์ค€ ์–ธ์–ด
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๊ธฐ๊ณ„์–ด ๋Œ€์‹ ์— ๋ช…๋ น ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์—ฐ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํ˜ธ๋ฅผ ๊ธฐ๊ณ„์–ด์™€ 1:1๋กœ ๋Œ€์‘์‹œ์ผœ ์ฝ”๋“œํ™”ํ•œ ๊ธฐํ˜ธ ์–ธ์–ด

๊ธฐ๊ณ„์–ด(Machine Language)

  • ํ”„๋กœ๊ทธ๋žจ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ๋‹จ๊ณ„์˜ ๊ฐœ๋….
  • ์ค‘์•™์ฒ˜๋ฆฌ์žฅ์น˜(CPU)๊ฐ€ ์ง์ ‘ ํŒ๋…ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„ํŠธ(0๊ณผ 1์˜ ์กฐํ•ฉ) ๋‹จ์œ„๋กœ ์“ฐ์ธ ์ปดํ“จํ„ฐ ์–ธ์–ด

 

๊ธฐ๋ณธ๊ตฌ์กฐ

๊ธฐ๋ณธํ˜•ํƒœ : ๋ช…๋ น์–ด(์˜ต์ฝ”๋“œ) + ์ธ์ž(์˜คํผ๋žœ๋“œ)

๋ช…๋ น์–ด (์˜ต์ฝ”๋“œ)

๋ช…๋ น ์ฝ”๋“œ ์„ค๋ช…
๋ฐ์ดํ„ฐ ์ด๋™(Data Transfer) mov, lea
์‚ฐ์ˆ  ์—ฐ์‚ฐ(Arithmetic) inc, dec, add, sub
๋…ผ๋ฆฌ ์—ฐ์‚ฐ(Logical) and, or, xor, not
๋น„๊ต(Comparison) cmp, test
๋ถ„๊ธฐ(Branch) jmp,  je, jg, jl , jnz
์Šคํƒ(Stack) push, pop, pushad, popad
ํ”„๋กœ์‹œ์ ธ(Procedure) call, ret, leave
์‹œ์Šคํ…œ ์ฝœ(System call) syscall
์ธํ„ฐ๋ŸฝํŠธ int (cpu๊ฐ€ ์ž ๊น ๋ฉˆ์ถ”๋Š” ๋ช…๋ น์–ด)

์ธ์ž (์˜คํผ๋žœ๋“œ)

BYTE, WORD, DWORD, QWORD๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ 1๋ฐ”์ดํŠธ, 2๋ฐ”์ดํŠธ, 4๋ฐ”์ดํŠธ, 8๋ฐ”์ดํŠธ

  • ์ƒ์ˆ˜(Immediate Value)
  • ๋ ˆ์ง€์Šคํ„ฐ(Register)
  • ๋ฉ”๋ชจ๋ฆฌ(Memory)

 

๋ฐ์ดํ„ฐ ์ด๋™ (Data Transfer)

1. mov dst, src : src์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์„ dst์— ๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค.

mov eax, ebx  ebx์˜ ๊ฐ’์„ eax์— ๋Œ€์ž…
mov QWORD PTR[rdi], ebx ebx์˜ ๊ฐ’์„ eax๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์— ๋Œ€์ž…

 

2. lea dst, src : src์˜ ์ฃผ์†Œ๋ฅผ dst์— ๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค.

lea eax, [ebx] ebx์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ eax์— ๋Œ€์ž…

3. xchg dst, src : src์˜ ๊ฐ’๊ณผ dst์˜ ๊ฐ’์„ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

xchg eax, ebx eax์™€ ebx์˜ ๊ฐ’์„ ๊ตํ™˜
xchg al, BYTE PTR [ebx] al ๋ ˆ์ง€์Šคํ„ฐ์™€ ebx ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ”์ดํŠธ ๊ฐ’์„ ๊ตํ™˜
xchg eax, DWORD PTR [ebx] eax ๋ ˆ์ง€์Šคํ„ฐ์™€ ebx ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ 4๋ฐ”์ดํŠธ ๊ฐ’์„ ๊ตํ™˜

 

 

์‚ฐ์ˆ  ์—ฐ์‚ฐ (Arithmetic)

1. add dst, src : dst์— src์˜ ๊ฐ’์„ ๋”ํ•ฉ๋‹ˆ๋‹ค.

add eax, 3  eax += 3
add eax, DWORD PTR[ebx] ebx ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’์„ eax์— ๋”ํ•จ

 

2. sub dst, src : dst์—์„œ src์˜ ๊ฐ’์„ ๋บ๋‹ˆ๋‹ค.

sub eax, 3  eax -= 3
sub eax, DWORD PTR[ebx] ebx ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’์„ eax์— ๋บŒ

 

3. inc op: op์˜ ๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚ด

inc eax eax += 1

4. dec op: op์˜ ๊ฐ’์„ 1 ๊ฐ์†Œ ์‹œํ‚ด

dec eax eax -= 1

 

๋…ผ๋ฆฌ ์—ฐ์‚ฐ (Logical)

 

1. and dst, src : dst์™€ src์˜ ๊ฐ’์„ ๋น„ํŠธ ๋‹จ์œ„๋กœ AND ์—ฐ์‚ฐํ•ฉ๋‹ˆ๋‹ค.

and eax, 0xFF  eax &= 0xFF
and eax, DWORD PTR[ebx] ebx ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’๊ณผ eax๋ฅผ AND ์—ฐ์‚ฐ

 

2. or dst, src : dst์™€ src์˜ ๊ฐ’์„ ๋น„ํŠธ ๋‹จ์œ„๋กœ OR ์—ฐ์‚ฐํ•ฉ๋‹ˆ๋‹ค.

or eax, 0xFF eax |= 0xFF
or eax, DWORD PTR[ebx]  ebx ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’๊ณผ eax๋ฅผ OR ์—ฐ์‚ฐ

 

3. xor dst, src : dst์™€ src์˜ ๊ฐ’์„ ๋น„ํŠธ ๋‹จ์œ„๋กœ XOR ์—ฐ์‚ฐํ•ฉ๋‹ˆ๋‹ค.

xor eax, eax eax ^= eax (๊ฒฐ๊ณผ์ ์œผ๋กœ eax = 0)
xor eax, DWORD PTR[ebx] ebx ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’๊ณผ eax๋ฅผ XOR ์—ฐ์‚ฐ

 

4. not op : op์˜ ๋น„ํŠธ๋ฅผ ๋ฐ˜์ „์‹œํ‚ต๋‹ˆ๋‹ค.

not eax  eax = ~eax

 

๋น„๊ต (Comparison)

1. cmp dst, src : dst์™€ src์˜ ๊ฐ’์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

cmp eax, 5 eax์™€ 5๋ฅผ ๋น„๊ต
cmp eax, DWORD PTR[ebx] eax์™€ ebx ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’์„ ๋น„๊ต

 

2. test dst, src : dst์™€ src์˜ ๋น„ํŠธ ๋‹จ์œ„ AND ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

test eax, eax eax์™€ eax์˜ ๋น„ํŠธ ๋‹จ์œ„ AND ์—ฐ์‚ฐ (๊ฒฐ๊ณผ์ ์œผ๋กœ eax๊ฐ€ 0์ธ์ง€ ํ™•์ธ)
test eax, 0x01 eax์™€ 0x01์˜ ๋น„ํŠธ ๋‹จ์œ„ AND ์—ฐ์‚ฐ

 

๋ถ„๊ธฐ (Branch)

 

1. ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ง€์ •๋œ ์ฃผ์†Œ๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.

jmp 0x00401000 ๋ฌด์กฐ๊ฑด ์ฃผ์†Œ 0x00401000์œผ๋กœ ์ ํ”„
je 0x00401000 ZF == 1์ด๋ฉด ์ฃผ์†Œ 0x00401000์œผ๋กœ ์ ํ”„
jne 0x00401000 ZF == 0์ด๋ฉด ์ฃผ์†Œ 0x00401000์œผ๋กœ ์ ํ”„
jg 0x00401000 eax > 0์ด๋ฉด ์ฃผ์†Œ 0x00401000์œผ๋กœ ์ ํ”„
jl 0x00401000 eax < 0์ด๋ฉด ์ฃผ์†Œ 0x00401000์œผ๋กœ ์ ํ”„
jge 0x00401000 eax >= 0์ด๋ฉด ์ฃผ์†Œ 0x00401000์œผ๋กœ ์ ํ”„
jle 0x00401000 eax <= 0์ด๋ฉด ์ฃผ์†Œ 0x00401000์œผ๋กœ ์ ํ”„

 

 

์Šคํƒ (Stack)

1. push src : src์˜ ๊ฐ’์„ ์Šคํƒ์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ์†Œํ•˜๊ณ , ๊ทธ ์œ„์น˜์— ๊ฐ’์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

push eax eax์˜ ๊ฐ’์„ ์Šคํƒ์— ํ‘ธ์‹œ (rsp ๊ฐ์†Œ, *rsp = eax)
push 0x1234 ๊ฐ’ 0x1234๋ฅผ ์Šคํƒ์— ํ‘ธ์‹œ (rsp ๊ฐ์†Œ, *rsp = 0x1234)
push rax rax์˜ ๊ฐ’์„ ์Šคํƒ์— ํ‘ธ์‹œ (rsp ๊ฐ์†Œ, *rsp = rax)

 

2. pushad : ๋ชจ๋“  ๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์Šคํƒ์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. (eax, ecx, edx, ebx, esp, ebp, esi, edi๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ‘ธ์‹œ)

pushad  ๋ชจ๋“  ๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์Šคํƒ์— ํ‘ธ์‹œ (rsp ๊ฐ์†Œ, ๊ฐ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์ด ์ˆœ์„œ๋Œ€๋กœ ์Šคํƒ์— ์ €์žฅ)

3. pop dst : ์Šคํƒ์—์„œ ๊ฐ’์„ ํŒํ•˜์—ฌ dst์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ํฌ์ธํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ , ๊ทธ ์œ„์น˜์—์„œ ๊ฐ’์„ ์ฝ์–ด dst์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

pop ebx ์Šคํƒ์—์„œ ๊ฐ’์„ ํŒํ•˜์—ฌ ebx์— ์ €์žฅ (*rsp = ebx, rsp ์ฆ๊ฐ€)
pop eax ์Šคํƒ์—์„œ ๊ฐ’์„ ํŒํ•˜์—ฌ eax์— ์ €์žฅ (*rsp = eax, rsp ์ฆ๊ฐ€)
pop rax ์Šคํƒ์—์„œ ๊ฐ’์„ ํŒํ•˜์—ฌ rax์— ์ €์žฅ (*rsp = rax, rsp ์ฆ๊ฐ€)

 

4. popad : ์Šคํƒ์—์„œ ๋ชจ๋“  ๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ํŒํ•ฉ๋‹ˆ๋‹ค. (์ˆœ์„œ๋Œ€๋กœ eax, ecx, edx, ebx, esp, ebp, esi, edi์— ์ €์žฅ)

popad ์Šคํƒ์—์„œ ๋ชจ๋“  ๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ํŒ

 

ํ”„๋กœ์‹œ์ € (Procedure)

1. call address : ์ง€์ •๋œ ์ฃผ์†Œ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ „์— ํ˜„์žฌ์˜ ๋ช…๋ น์–ด ํฌ์ธํ„ฐ๋ฅผ ์Šคํƒ์— ํ‘ธ์‹œํ•˜์—ฌ ๋‚˜์ค‘์— ret ๋ช…๋ น์–ด๋กœ ๋ณต๊ท€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

call 0x00401000 ์ฃผ์†Œ 0x00401000์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ ([rsp] = return address, rsp ๊ฐ์†Œ)

2. ret : ํ˜„์žฌ ์Šคํƒ์—์„œ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ํŒํ•˜์—ฌ ๊ทธ ์ฃผ์†Œ๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ดํ›„ ํ˜ธ์ถœ๋œ ์ง€์ ์œผ๋กœ ๋ณต๊ท€ํ•ฉ๋‹ˆ๋‹ค.

ret ์Šคํƒ์—์„œ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ํŒํ•˜์—ฌ ๊ทธ ์ฃผ์†Œ๋กœ ์ ํ”„ (rsp ์ฆ๊ฐ€)

3. leave : ํ˜„์žฌ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ret ๋ช…๋ น์–ด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์Šคํƒ ํฌ์ธํ„ฐ(rsp)๋ฅผ ๋ณต์›ํ•˜๊ณ , ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐrbp๋ฅผ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

leave  ํ˜„์žฌ ์Šคํƒ ํ”„๋ ˆ์ž„ ์ •๋ฆฌ (rsp = rbp, pop rbp)

 

์‹œ์Šคํ…œ ์ฝœ (System Call)

syscall : ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ปค๋„ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ช…๋ น์–ด๋กœ ์‹œ์Šคํ…œ ์ฝœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ปค๋„ ๋ชจ๋“œ๋กœ์˜ ์ „ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์šด์˜ ์ฒด์ œ์˜ ์„œ๋น„์Šค๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

syscall ํ˜„์žฌ ๋ ˆ์ง€์Šคํ„ฐ์— ์„ค์ •๋œ ์‹œ์Šคํ…œ ์ฝœ ๋ฒˆํ˜ธ์™€ ์ธ์ˆ˜๋กœ ์ปค๋„ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์‹œ์Šคํ…œ ์ฝœ์„ ์‹คํ–‰

์˜ˆ์‹œ ์ฝ”๋“œ:

mov rax, 60 ์‹œ์Šคํ…œ ์ฝœ ๋ฒˆํ˜ธ 60 (๋ฆฌ๋ˆ…์Šค์—์„œ exit ์‹œ์Šคํ…œ ์ฝœ) ์„ค์ •
mov rdi, 0 exit ์‹œ์Šคํ…œ ์ฝœ์˜ ์ธ์ˆ˜๋กœ 0 (์ข…๋ฃŒ ์ƒํƒœ ์ฝ”๋“œ) ์„ค์ •
syscall exit ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ

 

์˜ˆ์‹œ:

mov rax, 1        ; ์‹œ์Šคํ…œ ์ฝœ ๋ฒˆํ˜ธ 1 (sys_write)
mov rdi, 1        ; ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ 1 (stdout)
mov rsi, message  ; ๋ฉ”์‹œ์ง€์˜ ์ฃผ์†Œ
mov rdx, 13       ; ๋ฉ”์‹œ์ง€์˜ ๊ธธ์ด
syscall           ; ์‹œ์Šคํ…œ ์ฝœ ํ˜ธ์ถœ

 

์œ„์˜ ์˜ˆ์‹œ์—์„œ, sys_write ์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์ค€ ์ถœ๋ ฅ(stdout)์— ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. rax์— ์‹œ์Šคํ…œ ์ฝœ ๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•˜๊ณ , rdi, rsi, rdx์— ์ธ์ˆ˜๋ฅผ ์„ค์ •ํ•œ ํ›„ syscall ๋ช…๋ น์–ด๋กœ ์ปค๋„ ๋ชจ๋“œ์—์„œ ์‹œ์Šคํ…œ ์ฝœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ธํ„ฐ๋ŸฝํŠธ (Interrupt)

int n : ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. n์€ ์ธํ„ฐ๋ŸฝํŠธ ๋ฒกํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•ด๋‹น ๋ฒกํ„ฐ์— ์˜ํ•ด ์ง€์ •๋œ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์šด์˜ ์ฒด์ œ๋‚˜ ํ•˜๋“œ์›จ์–ด์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ: ํ•˜๋“œ์›จ์–ด ์žฅ์น˜๊ฐ€ CPU์˜ ์ฃผ์˜๋ฅผ ์š”๊ตฌํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: ํ‚ค๋ณด๋“œ ์ž…๋ ฅ, ํƒ€์ด๋จธ ์ด๋ฒคํŠธ).
  • ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ: ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ CPU์— ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์š”์ฒญํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: ์‹œ์Šคํ…œ ์ฝœ).

์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ๊ณผ์ •:

  1. ํ˜„์žฌ ๋ช…๋ น์–ด ์ €์žฅ : ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด CPU๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ์Šคํƒ์— ์ €์žฅํ•˜์—ฌ ๋‚˜์ค‘์— ๋ณต๊ท€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ธํ„ฐ๋ŸฝํŠธ ๋ฒกํ„ฐ ์กฐํšŒ : ์ธํ„ฐ๋ŸฝํŠธ ๋ฒกํ„ฐ ํ…Œ์ด๋ธ”์—์„œ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์ฃผ์†Œ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
  3. ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ : ์กฐํšŒ๋œ ํ•ธ๋“ค๋Ÿฌ ์ฃผ์†Œ๋กœ ์ ํ”„ํ•˜์—ฌ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ณต๊ท€ : ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด ์Šคํƒ์—์„œ ์ €์žฅ๋œ ๋ช…๋ น์–ด ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์™€ ๋ณต๊ท€ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ:

int 0x80 ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ ์ฝœ ์ธํ„ฐ๋ŸฝํŠธ ํ˜ธ์ถœ
mov eax, 1 ์‹œ์Šคํ…œ ์ฝœ ๋ฒˆํ˜ธ 1 (sys_exit) ์„ค์ •
mov ebx, 0 ์ข…๋ฃŒ ์ฝ”๋“œ 0 ์„ค์ •
int 0x80 ์‹œ์Šคํ…œ ์ฝœ ํ˜ธ์ถœ (ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ)

 

์˜ˆ์‹œ ์„ค๋ช…:

mov eax, 1      ; ์‹œ์Šคํ…œ ์ฝœ ๋ฒˆํ˜ธ 1 (sys_exit)
mov ebx, 0      ; ์ข…๋ฃŒ ์ƒํƒœ ์ฝ”๋“œ 0
int 0x80        ; ๋ฆฌ๋ˆ…์Šค ์ปค๋„๋กœ ์‹œ์Šคํ…œ ์ฝœ ์š”์ฒญ

์ด ์ฝ”๋“œ ์˜ˆ์ œ๋Š” int 0x80 ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋ˆ…์Šค์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. eax ๋ ˆ์ง€์Šคํ„ฐ์— ์‹œ์Šคํ…œ ์ฝœ ๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•˜๊ณ , ebx์— ์ธ์ˆ˜๋ฅผ ์„ค์ •ํ•œ ํ›„ int 0x80์„ ํ†ตํ•ด ์ปค๋„ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์‹œ์Šคํ…œ ์ฝœ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•