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.0570 sec