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