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