E D R , A S I H C RSS

CTo Assembly

1. before

์›๋ฌธ ์ถœ์ฒ˜ : http://blog.naver.com/webman21/18265245
๋‚ด์šฉ์ด ๋ณผ๋งŒํ•ด์„œ ์˜ฌ๋ฆผ. ํ .. ใ…ก.ใ…ก ์ด์ œ copy paste ๋„ ๊ท€์ฐฎ๊ตฌ๋‚˜;; ํ‚ค๋ณด๋“œ์— ์น˜๊ธฐ๊ฐ€ ์‹ซ๋‹ค.

2. ๊ฐœ์š”

๋งˆ์ดํฌ๋กœ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€? ๋งˆ์ดํฌ๋กœ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์€ ๋งˆ์ดํฌ๋กœํ”„๋กœ์„ธ์„œ ์žฅ์น˜ (microprocessor unit, MPU), ๋ฒ„์Šค ์‹œ์Šคํ…œ, ๋ฉ”๋ชจ๋ฆฌ ํ•˜์œ„์‹œ์Šคํ…œ, ์ž…์ถœ๋ ฅ ํ•˜์œ„์‹œ์Šคํ…œ, ๋ชจ๋“  ๊ตฌ์„ฑ์š”์†Œ๋“ค๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ „ํ˜•์ ์ธ ๋Œ€๋‹ต์ด๋‹ค.

์ด๋Š” ํ•˜๋“œ์›จ์–ด๋งŒ์„ ๊ณ ๋ คํ•œ ๊ฒƒ์ด๋‹ค. ๋ชจ๋“  ๋งˆ์ดํฌ๋กœ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์€ ํ•˜๋“œ์›จ์–ด ๊ตฌ์„ฑ์š”์†Œ๋“ค์˜ ์ž‘์—…์„ ์ง€์‹œํ•  ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ปดํ“จํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์‹œ์Šคํ…œ์ธก(์‹œ์Šคํ…œ ์†Œํ”„ํŠธ์›จ์–ด)๊ณผ ์‚ฌ์šฉ์ž์ธก(์‚ฌ์šฉ์ž ์†Œํ”„ํŠธ์›จ์–ด)์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•ด ํ•„์š”ํ•œ ํ•จ์ˆ˜๋“ค์„ ๋ชจ์•„๋‘” ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ์†Œํ”„ํŠธ์›จ์–ด์— ํฌํ•จ๋œ๋‹ค.

๊ณ ๊ธ‰์–ธ์–ด ๋ณ€ํ™˜๊ธฐ, ์–ด์…ˆ๋ธ”๋Ÿฌ, ํŽธ์ง‘๊ธฐ, ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ๋•๋Š” ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์‹œ์Šคํ…œ ์†Œํ”„ํŠธ์›จ์–ด์— ์†ํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—๋Š” ๊ธฐ๊ณ„์–ด, ์–ด์…ˆ๋ธ”๋ฆฌ์–ด, ๊ณ ๊ธ‰์–ธ์–ด ์„ธ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Œ์„ ์•ˆ๋‹ค.

๊ธฐ๊ณ„์–ด ํ”„๋กœ๊ทธ๋žจ์€ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ๋ช…๋ น์–ด๋Š” ๊ธฐ๊ณ„์–ด ๋ช…๋ น์–ด์™€ ๋ณดํ†ต ์ผ๋Œ€์ผ ๊ด€๊ณ„๋กœ ๋Œ€์‘ํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ณ ๊ธ‰์–ธ์–ด ๋ช…๋ น์–ด๋Š” ์˜์–ด์— ๋งค์šฐ ๊ฐ€๊นŒ์›Œ์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Œ€์‘ํ•œ๋‹ค. ๊ฒฐ๊ตญ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋‚˜ ๊ณ ๊ธ‰์–ธ์–ด ํ”„๋กœ๊ทธ๋žจ์€ ๋ณ€ํ™˜๊ธฐ๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋˜์•ผ ํ•œ๋‹ค. ์ด ๋ณ€ํ™˜๊ธฐ๋ฅผ ๊ฐ๊ฐ ์–ด์…ˆ๋ธ”๋Ÿฌ(assembler), ์ปดํŒŒ์ผ๋Ÿฌ(compiler) ํ˜น์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ(interpreter)๋ผ๊ณ  ํ•œ๋‹ค.

C/C++๊ฐ™์€ ๊ณ ๊ธ‰์–ธ์–ด์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ณ ๊ธ‰์–ธ์–ด๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. GNU C/C++ ์ปดํŒŒ์ผ๋Ÿฌ์˜ -S ์˜ต์…˜์€ ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค์— ํ•ด๋‹นํ•˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋ฐ˜๋ณต, ํ•จ์ˆ˜ ํ˜ธ์ถœ, ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๊ฐ€ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•˜๋Š”์ง€ ์•Œ๋ฉด C ๋‚ด๋ถ€๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ์ด ๊ธ€์„ ์ดํ•ดํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ์ปดํ“จํ„ฐ๊ตฌ์กฐ์™€ Intel x86 ์–ด์…ˆ๋ธ”๋ฆฌ์–ด์— ์ต์ˆ™ํ•ด์•ผ ํ•œ๋‹ค.

3. ์‹œ์ž‘

๋จผ์ € hello world๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ C ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ , -S ์˜ต์…˜์œผ๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค. ์ž…๋ ฅํŒŒ์ผ์— ๋Œ€ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. GCC๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™•์žฅ์ž `.c'๋ฅผ `.s'๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์–ด์…ˆ๋ธ”๋ŸฌํŒŒ์ผ๋ช…์„ ์ง“๋Š”๋‹ค. ์–ด์…ˆ๋ธ”๋ŸฌํŒŒ์ผ ๋์˜ ๋ช‡์ค„์„ ํ•ด์„ํ•ด๋ณด์ž.

80386 ์ด์ƒ ํ”„๋กœ์„ธ์„œ์—๋Š” ๋งŽ์€ ๋ ˆ์ง€์Šคํ„ฐ์™€ ๋ช…๋ น์–ด, ์ฃผ์†Œ์ง€์ •๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด ๋ช‡๊ฐœ๋งŒ ์ข€ ์•Œ์•„๋„ GNU ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ๋ช…๋ น์–ด๋Š” ๋ผ๋ฒจ(label), ์—ฐ์ƒ๊ธฐํ˜ธ(mnemonic), ์—ฐ์‚ฐ์ˆ˜(operand)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์—ฐ์‚ฐ์ˆ˜ ํ‘œ์‹œ๋ฐฉ๋ฒ•์—์„œ ์—ฐ์‚ฐ์ˆ˜์˜ ์ฃผ์†Œ์ง€์ •๋ฐฉ์‹์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์—ฐ์ƒ๊ธฐํ˜ธ๋Š” ์—ฐ์‚ฐ์ˆ˜์— ์ €์žฅ๋œ ์ •๋ณด์— ์ž‘์—…์„ ํ•œ๋‹ค. ์‚ฌ์‹ค ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ๋ช…๋ น์–ด๋Š” ๋ ˆ์ง€์Šคํ„ฐ์™€ ๋ฉ”๋ชจ๋ฆฌ์œ„์น˜์— ์ž‘์—…์„ ํ•œ๋‹ค. 80386๊ณ„์—ด์€ eax, ebx, ecx ๋“ฑ์˜ (32๋น„ํŠธ) ๋ฒ”์šฉ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋‘ ๋ ˆ์ง€์Šคํ„ฐ, ebp์™€ esp๋Š” ์Šคํƒ์„ ์กฐ์ž‘ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. GNU Assembler (GAS) ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ ์ „ํ˜•์ ์ธ ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:


~cpp
movl $10, %eax

์ด ๋ช…๋ น์–ด๋Š” eax ๋ ˆ์ง€์Šคํ„ฐ์— ๊ฐ’ 10์„ ์ €์žฅํ•œ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ๋ช… ์•ž์˜ `%'์™€ ์ง์ ‘๊ฐ’(immediate value) ์•ž์˜ '$'๋Š” ํ•„์ˆ˜ ์–ด์…ˆ๋ธ”๋Ÿฌ ๋ฌธ๋ฒ•์ด๋‹ค. ๋ชจ๋“  ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ์ด๋Ÿฐ ๋ฌธ๋ฒ•์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

๋ชฉ๋ก 1์€ first.s ํŒŒ์ผ์— ์ €์žฅํ•œ ์šฐ๋ฆฌ์˜ ์ฒซ๋ฒˆ์งธ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

#๋ชฉ๋ก 1
~cpp
.globl main
main:
  movl $20, %eax
  ret

cc first.s ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด ํŒŒ์ผ์„ ์–ด์…ˆ๋ธ”ํ•˜๊ณ  ๋งํฌํ•˜์—ฌ a.out์„ ๋งŒ๋“ ๋‹ค. GNU ์ปดํŒŒ์ผ๋Ÿฌ ์•ž๋‹จ cc๊ฐ€ `.s' ํ™•์žฅ์ž๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ํŒŒ์ผ๋กœ ์ธ์‹ํ•˜์—ฌ, ์ปดํŒŒ์ผ๋‹จ๊ณ„๋ฅผ ์ƒ๋žตํ•˜๊ณ  ์–ด์…ˆ๋ธ”๋Ÿฌ์™€ ๋ง์ปค๋ฅผ ๋ถ€๋ฅธ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์˜ ์ฒซ๋ฒˆ์งธ ์ค„์€ ์ฃผ์„์ด๋‹ค. ์–ด์…ˆ๋ธ”๋Ÿฌ ์ง€์‹œ์–ด .globl์€ ์‹ฌ๋ณผ main์„ ๋ง์ปค๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค. ๊ทธ๋ž˜์•ผ main์„ ํ˜ธ์ถœํ•˜๋Š” C ์‹œ์ž‘๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ฐ™์ด ๋งํฌํ•˜๋ฏ€๋กœ ์ค‘์š”ํ•˜๋‹ค. ์ด ์ค„์ด ์—†๋‹ค๋ฉด ๋ง์ปค๋Š” 'undefined reference to symbol main' (์‹ฌ๋ณผ main์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์ •์˜๋˜์ง€์•Š์Œ)์„ ์ถœ๋ ฅํ•œ๋‹ค (ํ•œ๋ฒˆ ํ•ด๋ด๋ผ). ํ”„๋กœ๊ทธ๋žจ์€ ๋‹จ์ˆœํžˆ ๋ ˆ์ง€์Šคํ„ฐ eax์— ๊ฐ’ 20์„ ์ €์žฅํ•˜๊ณ  ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

4. ์‚ฐ์ˆ ๊ณ„์‚ฐ, ๋น„๊ต, ๋ฐ˜๋ณต

๋‹ค์Œ ๋ชฉ๋ก 2 ํ”„๋กœ๊ทธ๋žจ์€ eax์— ์ €์žฅ๋œ ๊ฐ’์˜ ๊ณ„์Šน(factorial)์„ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ebx์— ์ €์žฅํ•œ๋‹ค.

#๋ชฉ๋ก 2
~cpp
.globl main
main: 
	movl $5, %eax
	movl $1, %ebx
L1:	cmpl $0, %eax		//eax์— ์ €์žฅ๋œ ๊ฐ’๊ณผ 0์„ ๋น„๊ต
	je L2			//0==eax ์ด๋ฉด L2๋กœ ๊ฑด๋„ˆ๋œ€ (je - jump if equal)
	imull %eax, %ebx	// ebx = ebx*eax
	decl %eax		//eax ๊ฐ์†Œ
	jmp L1			// L1์œผ๋กœ ๋ฌด์กฐ๊ฑด ๊ฑด๋„ˆ๋œ€
L2: 	ret

L1๊ณผ L2๋Š” ๋ผ๋ฒจ์ด๋‹ค. ์ œ์–ดํ๋ฆ„์ด L2์— ๋„๋‹ฌํ•˜๋ฉด, ebx๋Š” eax์— ์ €์žฅ๋œ ๊ฐ’์˜ ๊ณ„์Šน์„ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

5. ํ•จ์ˆ˜(subroutine)

๋ณต์žกํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋•Œ ์šฐ๋ฆฌ๋Š” ํ•ด๊ฒฐํ•  ๋ฌธ์ œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•„์š”ํ• ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ๋ชฉ๋ก 3์€ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ํ”„๋กœ๊ทธ๋žจ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๋ฐ˜ํ™˜์„ ๋ณด์—ฌ์ค€๋‹ค.

#๋ชฉ๋ก 3
~cpp
.globl main
main:
	movl $10, %eax
	call foo
	ret
foo:
	addl $5, %eax
	ret

call ๋ช…๋ น์–ด๋Š” ์‹คํ–‰์„ ํ•จ์ˆ˜ foo๋กœ ์˜ฎ๊ธด๋‹ค. foo์˜ ret ๋ช…๋ น์–ด๋Š” ์‹คํ–‰์„ ๋‹ค์‹œ main์˜ ํ˜ธ์ถœ ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ๋ช…๋ น์–ด๋กœ ์˜ฎ๊ธด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋“ค์„ ์ •์˜ํ•œ๋‹ค. ์ด ๋ณ€์ˆ˜๋“ค์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ๋ณ€์ˆ˜๊ฐ’์„ ์œ ์ง€ํ•˜๊ธฐ์œ„ํ•ด ์Šคํƒ์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ค‘์— ๋ฐ˜๋ณต๋˜๋Š” ์žฌ๊ท€ํ˜ธ์ถœ์‹œ(recursive call) activation record๊ฐ€ ์œ ์ง€๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. esp๋‚˜ ebp๊ฐ™์€ ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์šฉ๋ฒ•๊ณผ ์Šคํƒ์„ ๋‹ค๋ฃจ๋Š” push์™€ pop๊ฐ™์€ ๋ช…๋ น์–ด ์‚ฌ์šฉ๋ฒ•์€ ํ•จ์ˆ˜ํ˜ธ์ถœ๊ณผ ๋ฐ˜ํ™˜๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋Š”๋ฐ ์ค‘์š”ํ•˜๋‹ค.

6. ์Šคํƒ ์‚ฌ์šฉํ•˜๊ธฐ

ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ผ๋ถ€๋ฅผ ์Šคํƒ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด ๋น„์›Œ๋‘์—ˆ๋‹ค. Intel 80386 ์ด์ƒ์˜ ๋งˆ์ดํฌ๋กœํ”„๋กœ์„ธ์„œ์—๋Š” ์Šคํƒ ์ตœ์ƒ์œ„ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š”, ์Šคํƒํฌ์ธํ„ฐ(stack pointer)๋ผ๋Š” esp ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์žˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ 1์€ ์Šคํƒ์— ์ €์žฅ๋œ ์„ธ ์ •์ˆ˜๊ฐ’ 49, 30, 72๋ฅผ ๋ณด์—ฌ์ค€๋‹ค (์ •์ˆ˜๋Š” ๊ฐ๊ฐ 4 ๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค). esp ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์Šคํƒ ์ตœ์ƒ์œ„ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค.

๊ทธ๋ฆผ 1

์œ„๋กœ ์Œ“์—ฌ๊ฐ€๋Š” ๋ฒฝ๋Œ๊ณผ ๋‹ฌ๋ฆฌ Intel ์ปดํ“จํ„ฐ์˜ ์Šคํƒ์€ ์•„๋ž˜๋ฐฉํ–ฅ์œผ๋กœ ์ž๋ž€๋‹ค. ๊ทธ๋ฆผ 2๋Š” ๋ช…๋ น์–ด pushl $15๋ฅผ ์‹คํ–‰ํ•œํ›„ ์Šคํƒ์„ ๋ณด์—ฌ์ค€๋‹ค.

๊ทธ๋ฆผ 2

์Šคํƒํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ๋Š” 4๋งŒํผ ๊ฐ์†Œํ•˜๊ณ , ์ˆซ์ž 15๋ฅผ 4 ๋ฐ”์ดํŠธ(์ฃผ์†Œ 1988, 1989, 1990, 1991)์— ์ €์žฅํ•œ๋‹ค.

๋ช…๋ น์–ด popl %eax๋Š” ์Šคํƒ ์ตœ์ƒ์œ„์— ์žˆ๋Š” ๊ฐ’(4 ๋ฐ”์ดํŠธ)์„ eax ๋ ˆ์ง€์Šคํ„ฐ์— ๋ณต์‚ฌํ•˜๊ณ  esp๋ฅผ 4๋งŒํผ ์ฆ๊ฐ€ํ•œ๋‹ค. ๋งŒ์•ฝ ์Šคํƒ ์ตœ์ƒ์œ„์— ์žˆ๋Š” ๊ฐ’์„ ๋ ˆ์ง€์Šคํ„ฐ์— ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด? ๋ช…๋ น์–ด addl $4, %esp๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์Šคํƒํฌ์ธํ„ฐ๋งŒ ์ฆ๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

๋ชฉ๋ก 3์—์„œ ๋ช…๋ น์–ด call foo๋Š” ํ˜ธ์ถœ์„ ๋งˆ์นœํ›„ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  foo๋กœ ๋ถ„๊ธฐํ•œ๋‹ค. ํ•จ์ˆ˜๋Š” ret์—์„œ ๋๋‚˜๊ณ , ์‹คํ–‰์„ ์Šคํƒ ์ตœ์ƒ์œ„์—์„œ ๊ฐ€์ ธ์˜จ ์ฃผ์†Œ์— ์žˆ๋Š” ๋ช…๋ น์–ด๋กœ ์˜ฎ๊ธด๋‹ค. ๋ฌผ๋ก  ์Šคํƒ ์ตœ์ƒ์œ„์— ์œ ํšจํ•œ ๋ฐ˜ํ™˜์ฃผ์†Œ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

7. ์ง€์—ญ๋ณ€์ˆ˜(local variable) ๊ณต๊ฐ„ ํ• ๋‹นํ•˜๊ธฐ

C ํ”„๋กœ๊ทธ๋žจ์€ ์ˆ˜๋ฐฑ ์ˆ˜์ฒœ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. C ํ”„๋กœ๊ทธ๋žจ์— ํ•ด๋‹นํ•˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋ฉฐ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃจ๊ธฐ์œ„ํ•ด ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ถฉ๋Œ์—†์ด ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ๋ ค์ค€๋‹ค.

๋ ˆ์ง€์Šคํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ์ ๊ธฐ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ์— ๋‹ด์„ ์ˆ˜๋Š” ์—†๋‹ค. ์ง€์—ญ๋ณ€์ˆ˜๋Š” ์Šคํƒ์— ์œ„์น˜ํ•œ๋‹ค. ๋ชฉ๋ก 4๊ฐ€ ๊ทธ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค.

#๋ชฉ๋ก 4
~cpp
.globl main
main:
	call foo
	ret
foo:
	pushl %ebp
	movl %esp, %ebp
	subl $4, %esp
	movl $10, -4(%ebp)
	movl %ebp, %esp
	popl %ebp
	ret

๋จผ์ € ์Šคํƒํฌ์ธํ„ฐ์˜ ๊ฐ’์„ ๊ธฐ์ค€ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ(base pointer register) ebp์— ๋ณต์‚ฌํ•œ๋‹ค. ๊ธฐ์ค€ํฌ์ธํ„ฐ๋Š” ์Šคํƒ์˜ ๋‹ค๋ฅธ ์œ„์น˜๋ฅผ ์ ‘๊ทผํ• ๋•Œ ์‚ฌ์šฉํ•  ๊ณ ์ •๋œ ๊ธฐ์ค€์ ์ด๋‹ค. foo๋ฅผ ํ˜ธ์ถœํ•œ ์ฝ”๋“œ์—์„œ๋„ ebp๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๊ฐ’์„ esp ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์ „์— ์Šคํƒ์— ๋ณต์‚ฌํ•œ๋‹ค. ๋ช…๋ น์–ด subl $4, %esp๋Š” ์Šคํƒํฌ์ธํ„ฐ๋ฅผ ๊ฐ์†Œํ•˜์—ฌ ์ •์ˆ˜๋ฅผ ๋‹ด๊ธฐ์œ„ํ•œ (4 ๋ฐ”์ดํŠธ) ๊ณต๊ฐ„์„ ๋งŒ๋“ ๋‹ค. ๋‹ค์Œ ์ค„์€ ๊ฐ’ 10์„ ebp์—์„œ 4๋ฅผ ๋บ€ (4 ๋ฐ”์ดํŠธ) ์ฃผ์†Œ์— ๋ณต์‚ฌํ•œ๋‹ค. ๋ช…๋ น์–ด movl %ebp, %esp๋Š” ์Šคํƒํฌ์ธํ„ฐ๋ฅผ foo ์‹œ์ž‘์‹œ ๊ฐ€์กŒ๋˜ ๊ฐ’์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ณ , popl %ebp๋Š” ๊ธฐ์ค€ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ ๋˜๋Œ๋ฆฐ๋‹ค. ์Šคํƒํฌ์ธํ„ฐ๋Š” ์ด์ œ foo๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „๊ณผ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ์•„๋ž˜ ํ‘œ๋Š” main ์‹œ์ž‘๊ณผ ๋ชฉ๋ก 4์˜ (main์—์„œ ๋ฐ˜ํ™˜์„ ์ œ์™ธํ•œ) ๊ฐ ๋ช…๋ น์–ด ์‹คํ–‰ํ›„ ๋ ˆ์ง€์Šคํ„ฐ ebp, esp์™€ 3988์—์„œ 3999๊นŒ์ง€ ์Šคํƒ ์ฃผ์†Œ์˜ ๋‚ด์šฉ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” main์˜ ์ฒซ ๋ช…๋ น์–ด ์‹คํ–‰์ „์— ebp๋Š” ๊ฐ’ 7000, esp๋Š” ๊ฐ’ 4000์„ ๊ฐ€์ง€๋ฉฐ, ์Šคํƒ ์ฃผ์†Œ 3988์—์„œ 3999๊นŒ์ง€ ์ž„์˜์˜ ๊ฐ’ 219986, 1265789, 86์ด ์ €์žฅ๋˜์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๋˜, main์—์„œ call foo ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๊ฐ€ 30000์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

ํ‘œ 1

8. ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ๊ณผ ๊ฐ’ ๋ฐ˜ํ™˜

ํ•จ์ˆ˜๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ์œ„ํ•ด ์Šคํƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜๊ฐ€ eax ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•œ ๊ฐ’์ด ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์ด๋ผ๋Š” (์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” C ์ปดํŒŒ์ผ๋Ÿฌ์˜) ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ์Šคํƒ์— ๊ฐ’์„ ๋„ฃ์–ด์„œ ํ•จ์ˆ˜์—๊ฒŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ๋ชฉ๋ก 5๋Š” sqr์ด๋ผ๋Š” ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋กœ ์ด๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

#๋ชฉ๋ก 5
~cpp
.globl main
main:
	movl $12, %ebx
	pushl %ebx
	call sqr
	addl $4, %esp       //esp๋ฅผ push ์ด์ „ ๊ฐ’์œผ๋กœ ์กฐ์ •
	ret
sqr:
	movl 4(%esp), %eax
	imull %eax, %eax    //eax * eax๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ, ๊ฒฐ๊ณผ๋ฅผ eax์— ์ €์žฅ
	ret

sqr์˜ ์ฒซ๋ฒˆ์งธ ์ค„์„ ์ฃผ์˜์žˆ๊ฒŒ ์‚ดํŽด๋ผ. ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๋Š” ์ธก์€ ebx์˜ ๋‚ด์šฉ์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ช…๋ น์–ด call์„ ์‹คํ–‰ํ•œ๋‹ค. ํ˜ธ์ถœ์‹œ ๋ฐ˜ํ™˜์ฃผ์†Œ๋ฅผ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  sqr๋Š” ์Šคํƒ ์ตœ์ƒ์œ„์—์„œ 4 ๋ฐ”์ดํŠธ ๋–จ์–ด์ง„ ๊ณณ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

9. C์™€ ์–ด์…ˆ๋ธ”๋Ÿฌ ์„ž๊ธฐ

๋ชฉ๋ก 6์€ C ํ”„๋กœ๊ทธ๋žจ๊ณผ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ํ•จ์ˆ˜๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ํŒŒ์ผ main.c์— C ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ  sqr.s์— ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค. cc main.c sqr.s๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ํŒŒ์ผ๋“ค์„ ์ปดํŒŒ์ผํ•˜๊ณ  ๊ฐ™์ด ๋งํฌํ•œ๋‹ค.

๋ฐ˜๋Œ€๋„ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค. ๋ชฉ๋ก 7์€ C ํ•จ์ˆ˜ print์™€ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

#๋ชฉ๋ก 6
~cpp
//main.c
main()
{
	int i = sqr(11);
	printf("%d\n",i);
}

//sqr.s
.globl sqr
sqr:
	movl 4(%esp), %eax
	imull %eax, %eax
	ret


#๋ชฉ๋ก 7
//print.c
print(int i)
{
	printf("%d\n",i);
}

//main.s
.globl main
main:
	movl $123, %eax
	pushl %eax
	call print
	addl $4, %esp
	ret

10. GNU C๊ฐ€ ๋งŒ๋“œ๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ ์ถœ๋ ฅ

๋‚˜๋Š” ์ด ๊ธ€์ด gcc๊ฐ€ ๋งŒ๋“œ๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ ์ถœ๋ ฅ์„ ์ดํ•ดํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜๊ธธ ๊ธฐ๋Œ€ํ•œ๋‹ค. ๋ชฉ๋ก 8์€ gcc -S add.c๋กœ ๋งŒ๋“  ํŒŒ์ผ add.s๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. add.s๋ฅผ ํŽธ์ง‘ํ•˜์—ฌ ๋งŽ์€ (๋Œ€๋ถ€๋ถ„ ์ •๋ ฌ(alignment) ๋“ฑ์˜ ๋ชฉ์ ์˜) ์–ด์…ˆ๋ธ”๋Ÿฌ ์ง€์„œ์–ด๋ฅผ ์‚ญ์ œํ•˜์˜€์Œ์„ ๋ฐํžŒ๋‹ค.

#๋ชฉ๋ก 8
~cpp
//add.c
int add(int i,int j)
{
	int p = i + j;
	return p;
}

//add.s
.globl add
add:
	pushl %ebp
	movl %esp, %ebp
	subl $4, %esp		//์ •์ˆ˜ p์˜ ๊ณต๊ฐ„ ์ƒ์„ฑ
	movl 8(%ebp),%edx	//8(%ebp)๋Š” i๋ฅผ ์ง€์นญ
	addl 12(%ebp), %edx	//12(%ebp)๋Š” j๋ฅผ ์ง€์นญ
	movl %edx, -4(%ebp)	//-4(%ebp)๋Š” p๋ฅผ ์ง€์นญ
	movl -4(%ebp), %eax	//๋ฐ˜ํ™˜๊ฐ’์„ eax์— ์ €์žฅ
	leave			//์ฆ‰, movl %ebp, %esp; popl %ebp ret

์ด ํ”„๋กœ๊ทธ๋žจ์€ C ๋ฌธ์žฅ add(10,20)์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์–ด์…ˆ๋ธ”๋Ÿฌ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋จ์„ ํ™•์ธํ•˜๋ฉด ๋ช…ํ™•ํ•ด์ง„๋‹ค:


~cpp
pushl $20
pushl $10
call add

๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋จผ์ € ๋„ฃ๋Š” ๊ฒƒ์„ ์ฃผ๋ชฉํ•˜๋ผ.

10. ์ „์—ญ๋ณ€์ˆ˜(global variable)
์ง€์—ญ๋ณ€์ˆ˜์˜ ๊ณต๊ฐ„์€ ์Šคํ…ํฌ์ธํ„ฐ๋ฅผ ๊ฐ์†Œํ•˜์—ฌ ์Šคํƒ์— ํ™•๋ณดํ•˜๊ณ , ๋‹จ์ˆœํžˆ ์Šคํƒํฌ์ธํ„ฐ๋ฅผ ๋Š˜๋ ค์„œ ํ• ๋‹น๋œ ๊ณต๊ฐ„์„ ๋˜๋Œ๋ฆฐ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด GNU C๊ฐ€ ์ „์—ญ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ• ๊นŒ? ๋ชฉ๋ก 9๊ฐ€ ํ•ด๋‹ต์„ ์ค€๋‹ค.

#๋ชฉ๋ก 9
~cpp
//glob.c
int foo = 10;
main()
{
	int p = foo;
}

//glob.s
.globl foo
foo:
	.long 10
.globl main
main:
	pushl %ebp
	movl %esp,%ebp
	subl $4,%esp
	movl foo,%eax
	movl %eax,-4(%ebp)
	leave
	ret

๋ฌธ์žฅ foo: .long 10์€ foo๋ผ๋Š” 4 ๋ฐ”์ดํŠธ ๋ฉ์–ด๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด ๋ฉ์–ด๋ฆฌ๋ฅผ 10์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์ง€์‹œ์–ด .globl foo๋Š” ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ๋„ foo๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์ด์ œ ์ด๊ฒƒ์„ ์‚ดํŽด๋ณด์ž. ๋ฌธ์žฅ int foo๋ฅผ static int foo๋กœ ์ˆ˜์ •ํ•œ๋‹ค. ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ดํŽด๋ด๋ผ. ์–ด์…ˆ๋ธ”๋Ÿฌ ์ง€์‹œ์–ด .globl์ด ๋น ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (double, long, short, const ๋“ฑ) ๋‹ค๋ฅธ storage class์— ๋Œ€ํ•ด์„œ๋„ ์‹œ๋„ํ•ด๋ณด๋ผ.

11. ์‹œ์Šคํ…œํ˜ธ์ถœ(system call)

ํ”„๋กœ๊ทธ๋žจ์ด ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ˆ˜ํ•™ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ž…๋ ฅ์„ ๋ฐ›๊ณ , ์ถœ๋ ฅํ•˜๊ณ , ์ข…๋ฃŒํ•˜๋Š” ๋“ฑ ์–ด๋–ค ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์šด์˜์ฒด์ œ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. ์‚ฌ์‹ค ์šด์˜์ฒด์ œ ์„œ๋น„์Šค๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ๊ฐ„์˜ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋งค์šฐ ๋น„์Šทํ•˜๋‹ค.

๋ฆฌ๋ˆ…์Šค์—๋Š” ์‹œ์Šคํ…œํ˜ธ์ถœ์„ ํ•˜๋Š” ๋‘๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค: C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (libc) wrapper๋ฅผ ํ†ตํ•˜๊ฑฐ๋‚˜, ์ง์ ‘.

Libc wrapper๋Š” ์‹œ์Šคํ…œํ˜ธ์ถœ ๊ทœ์น™์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ณดํ˜ธํ•˜๊ณ , ์ปค๋„์— ๊ทธ๋Ÿฐ ์‹œ์Šคํ…œํ˜ธ์ถœ์ด ์—†๋Š” ๊ฒฝ์šฐ POSIX ํ˜ธํ™˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์œ ๋‹‰์Šค ์ปค๋„์€ ๋ณดํ†ต ๊ฑฐ์˜ POSIX์— ํ˜ธํ™˜ํ•œ๋‹ค: ์ฆ‰ ๋Œ€๋ถ€๋ถ„์˜ libc "์‹œ์Šคํ…œ์ฝœ"์˜ ๋ฌธ๋ฒ•์€ ์‹ค์ œ ์ปค๋„ ์‹œ์Šคํ…œํ˜ธ์ถœ์˜ ๋ฌธ๋ฒ•๊ณผ (๋ฐ˜๋Œ€๋กœ๋„) ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ libc๋ฅผ ๋ฒ„๋ฆฌ์ง€์•Š๋Š” ์ด์œ ๋Š” ์‹œ์Šคํ…œ์ฝœ wrapper์™ธ์— printf(), malloc() ๋“ฑ ํ•จ์ˆ˜๋„ ์žˆ๊ธฐ๋•Œ๋ฌธ์ด๋‹ค.

๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œํ˜ธ์ถœ์€ int 0x80์„ ํ†ตํ•ด ํ•œ๋‹ค. ๋ฆฌ๋ˆ…์Šค๋Š” ์ผ๋ฐ˜์ ์ธ ์œ ๋‹‰์Šค ํ˜ธ์ถœ ๊ทœ์น™๊ณผ ๋‹ค๋ฅธ "fastcall" ๊ทœ์น™์„ ์‚ฌ์šฉํ•œ๋‹ค. ์‹œ์Šคํ…œํ•จ์ˆ˜ ๋ฒˆํ˜ธ๋Š” eax์—, ์•„๊ทœ๋จผํŠธ๋Š” ์Šคํƒ์ด ์•„๋‹Œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ebx, ecx, edx, esi, edi, ebp์— ์•„๊ทœ๋จผํŠธ 6๊ฐœ๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์•„๊ทœ๋จผํŠธ๊ฐ€ ๋” ์žˆ๋‹ค๋ฉด ๊ฐ„๋‹จํžˆ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฒซ๋ฒˆ์งธ ์•„๊ทœ๋จผํŠธ๋กœ ๋„˜๊ธด๋‹ค. ๊ฒฐ๊ณผ๋Š” eax๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์Šคํƒ์„ ์ „ํ˜€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

์•„๋ž˜ ๋ชฉ๋ก 10์„ ์‚ดํŽด๋ณด์ž.

#๋ชฉ๋ก 10
~cpp
#fork.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
	fork();
	printf("Hello\n");
	return 0;
}

๋ช…๋ น์–ด cc -g fork.c -static์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•œ๋‹ค. gdb ๋„๊ตฌ์—์„œ ๋ช…๋ น์–ด disassemble fork๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. fork์— ํ•ด๋‹นํ•˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. -static์€ GCC์˜ ์ •์  ๋ง์ปค ์˜ต์…˜์ด๋‹ค (manpage ์ฐธ๊ณ ). ๋‹ค๋ฅธ ์‹œ์Šคํ…œํ˜ธ์ถœ๋„ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ณ  ์‹ค์ œ ์–ด๋–ป๊ฒŒ ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๋Š”์ง€ ์‚ดํŽด๋ด๋ผ.

๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ตœ์‹  ๋ฌธ์„œ๊ฐ€ ๋งŽ์•„์„œ ์—ฌ๊ธฐ์— ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ฒ ๋‹ค.

12. ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

GNU C๋Š” x86 ์•„ํ‚คํ…์ณ๋ฅผ ๋งค์šฐ ์ž˜ ์ง€์›ํ•˜๋ฉฐ, C ํ”„๋กœ๊ทธ๋žจ์— ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ ํ• ๋‹น์€ ์ง์ ‘ ์ง€์‹œํ•˜๊ฑฐ๋‚˜ GCC์— ๋งก๊ฒจ๋‘˜ ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก , ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด๋Š” ์•„ํ‚คํ…์ณ๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค.

asm ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด๋ฅผ C๋‚˜ C++ ํ”„๋กœ๊ทธ๋žจ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:


~cpp
asm ("fsin" : "=t" (answer) : "0" (angle));

๋Š” ๋‹ค์Œ C ๋ฌธ์žฅ์„ x86 ์‹์œผ๋กœ ์ฝ”๋”ฉํ•œ ๊ฒƒ์ด๋‹ค:


~cpp
answer = sin(angle);

์ผ๋ฐ˜์ ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ ๋ช…๋ น์–ด์™€ ๋‹ฌ๋ฆฌ asm ๋ฌธ์žฅ์€ C ๋ฌธ๋ฒ•์œผ๋กœ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ์—ฐ์‚ฐ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. Asm ๋ฌธ์žฅ์€ ์•„๋ฌด๋•Œ๋‚˜ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜?

Asm ๋ฌธ์žฅ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์ปดํ“จํ„ฐ ํ•˜๋“œ์›จ์–ด์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฒŒ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋นจ๋ฆฌ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋“œ์›จ์–ด์™€ ์ง์ ‘ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์šด์˜์ฒด์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ• ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, /usr/include/asm/io.h์—๋Š” ์ž…์ถœ๋ ฅ ํฌํŠธ๋ฅผ ์ง์ ‘ ์ ‘๊ทผํ•˜๊ธฐ์œ„ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด๊ฐ€ ์žˆ๋‹ค.
๋˜, ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ€์žฅ ์•ˆ์ชฝ ๋ฐ˜๋ณต๋ฌธ์˜ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ๊ฐ™์€ ๊ฐ๋„์— ๋Œ€ํ•œ sine๊ณผ cosine์€ fsincos x86 ๋ช…๋ น์–ด๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์•„๋งˆ๋„ ์•„๋ž˜ ๋‘ ๋ชฉ๋ก์€ ์ด ์ ์„ ์ž˜ ์ดํ•ดํ•˜๋„๋ก ๋„์™€์ค„ ๊ฒƒ์ด๋‹ค.
#๋ชฉ๋ก 11
#์ด๋ฆ„ : bit-pos-loop.c
#์„ค๋ช… : ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„ํŠธ ์œ„์น˜ ์ฐพ๊ธฐ


~cpp
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
	long max = atoi (argv[1]);
	long number;
	long i;
	unsigned position;
	volatile unsigned result;

	for (number = 1; number <= max; ; ++number) {
		for (i=(number>>1), position=0; i!=0; ++position)
			i >>= 1;
		result = position;
	}
	return 0;
}

#๋ชฉ๋ก 12
#์ด๋ฆ„ : bit-pos-asm.c
#์„ค๋ช… : bsrl์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„ํŠธ ์œ„์น˜ ์ฐพ๊ธฐ


~cpp
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	long max = atoi(argv[1]);
	long number;
	unsigned position;
	volatile unsigned result;

	for (number = 1; number <= max; ; ++number) {
		asm("bsrl %1, %0" : "=r" (position) : "r" (number));
		result = position;
	}
	return 0;
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ตœ์ƒ์˜ ์ตœ์ ํ™”๋กœ ๋‘ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•œ๋‹ค:


~cpp
$ cc -O2 -o bit-pos-loop bit-pos-loop.c
$ cc -O2 -o bit-pos-asm bit-pos-asm.c

์ตœ์†Œํ•œ ๋ช‡ ์ดˆ๋™์•ˆ ์‹คํ–‰๋˜๋„๋ก ํฐ ๊ฐ’์„ ๋ช…๋ นํ–‰ ์•„๊ทœ๋จผํŠธ๋กœ ์ฃผ๊ณ  time ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ์ฝ”๋“œ์˜ ์‹คํ–‰์‹œ๊ฐ„์„ ์žฐ๋‹ค.


~cpp
$ time ./bit-pos-loop 250000000

and


~cpp
$ time ./bit-pos-asm 250000000

๊ฒฐ๊ณผ๋Š” ์ปดํ“จํ„ฐ๋งˆ๋‹ค ๋‹ค๋ฅผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

GCC์˜ ์ตœ์ ํ™”๋Š” asm ํ‘œํ˜„์ด ์žˆ๋”๋ผ๋„ ์‹คํ–‰์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ์žฌ๋ฐฐ์—ดํ•˜๊ณ  ์žฌ์ž‘์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค. asm์˜ ์ถœ๋ ฅ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด, asm๊ณผ ์•„๊ทœ๋จผํŠธ ์‚ฌ์ด์— ํ‚ค์›Œ๋“œ volatile์ด ์—†๋Š” ํ•œ ์ตœ์ ํ™”๋Š” ๋ช…๋ น์–ด๋ฅผ ์ƒ๋žตํ•œ๋‹ค. (ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋กœ GCC๋Š” ์ถœ๋ ฅ ์—ฐ์‚ฐ์ˆ˜๊ฐ€ ์—†๋Š” asm์„ ๋ฐ˜๋ณต๋ฌธ ๋ฐ–์œผ๋กœ ์˜ฎ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.) asm์€ ์˜ˆ์ธกํ•˜๊ธฐ ํž˜๋“  ๋ฐฉ์‹์œผ๋กœ, ์‹ฌ์ง€์–ด ํ˜ธ์ถœ๊ฐ„์—๋„, ์˜ฎ๊ฒจ์งˆ ์ˆ˜ ์žˆ๋‹ค. ํŠน๋ณ„ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ๋ชจ๋‘ ๊ฐ™์€ asm์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ asm์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ธฐ๋•Œ๋ฌธ์— asm์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํšจ์œจ์„ฑ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค. GCC๋Š” ์–ด๋–ค ์ตœ์ ํ™”๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๋ณด์ˆ˜์ ์ธ ์ถ”์ธก์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

13. ์—ฐ์Šต๋ฌธ์ œ

๋ชฉ๋ก 6์˜ C ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋ผ. ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ• ๋•Œ -Wall ์˜ต์…˜์ด ์ถœ๋ ฅํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์—†๋„๋ก ์ˆ˜์ •ํ•˜๋ผ. ๋‘ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•˜๋ผ. ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๊ฐ€?
์—ฌ๋Ÿฌ ์ž‘์€ C ํ”„๋กœ๊ทธ๋žจ์„ (-O2 ๊ฐ™์€) ์ตœ์ ํ™” ์˜ต์…˜์„ ์ฃผ๊ณ  ๋˜ ์•ˆ์ฃผ๊ณ  ์ปดํŒŒ์ผํ•ด๋ณด๋ผ. ๊ฒฐ๊ณผ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉํ•œ ๊ณตํ†ต๋œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์ฐพ์•„๋ผ.
switch ๋ฌธ์žฅ์— ๋Œ€ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋ผ.
์ธ๋ผ์ธ asm ๋ฌธ์žฅ์ด ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ž‘์€ C ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•ด๋ณด๋ผ. ์ด๋Ÿฐ ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ์—๋Š” ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๊ฐ€?
๊ฐ์‹ธ์ธ ํ•จ์ˆ˜(nested function)๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜ ("๊ฐ์‹ธ๋Š” ํ•จ์ˆ˜(enclosing function") ์•ˆ์—์„œ ์ •์˜๋˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:
๊ฐ์‹ธ์ธ ํ•จ์ˆ˜๋Š” ๊ฐ์‹ธ๋Š” ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ ,
๊ฐ์‹ธ์ธ ํ•จ์ˆ˜๋Š” ๊ฐ์‹ธ๋Š” ํ•จ์ˆ˜์— ์ง€์—ญ์ ์ด๋‹ค(local). ์ฆ‰, ๊ฐ์‹ธ๋Š” ํ•จ์ˆ˜๊ฐ€ ๊ฐ์‹ธ์ธ ํ•จ์ˆ˜์˜ ํฌ์ธํ„ฐ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ฐ์‹ธ๋Š” ํ•จ์ˆ˜ ๋ฐ–์—์„œ ๊ฐ์‹ธ์ธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

๊ฐ์‹ธ์ธ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜์˜ ๋ฒ”์œ„(visibility)๋ฅผ ์กฐ์ ˆํ•˜๊ธฐ๋•Œ๋ฌธ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜ ๋ชฉ๋ก 13์„ ์ฐธ๊ณ ํ•˜๋ผ:

#๋ชฉ๋ก 13
~cpp
/* myprint.c */
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int i;
	void my_print(int k)
	{
		printf("%d\n",k);
	}
	scanf("%d",&i);
	my_print(i);
	return 0;
}

์ด ํ”„๋กœ๊ทธ๋žจ์„ cc -S myprint.c๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋ผ. ๋˜, ๋ช…๋ น์–ด cc -pedantic myprint.c๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•ด๋ณด๋ผ. ๋ฌด์—‡์ด ๋ณด์ด๋Š”๊ฐ€?
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:44
Processing time 0.0180 sec