๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
CS/Computer Architecture

[์ปดํ“จํ„ฐ๊ตฌ์กฐ] ์„œ๋ธŒ๋ฃจํ‹ด ๋ช…๋ น์–ด

by haerr 2024. 11. 27.

 ๐Ÿ’ ์„œ๋ธŒ๋ฃจํ‹ด์ด๋ž€?

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

 

์„œ๋ธŒ๋ฃจํ‹ด์˜ ํŠน์ง•

1. ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ: ์„œ๋ธŒ๋ฃจํ‹ด์€ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ํ˜ธ์ถœ๋˜์–ด ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ณต์žกํ•œ ์ˆ˜ํ•™์  ์—ฐ์‚ฐ์ด๋‚˜ ์ž…์ถœ๋ ฅ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ ์ •์˜ํ•ด ๋‘๊ณ  ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์žฅ์†Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์บก์Аํ™”: ์„œ๋ธŒ๋ฃจํ‹ด์€ ๋…๋ฆฝ์ ์ธ ์ฝ”๋“œ ๋ธ”๋ก์œผ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ ๋ถ€๋ถ„๊ณผ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠน์ • ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด๋„ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

3. ์ž…์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜: ์„œ๋ธŒ๋ฃจํ‹ด์€ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•จ์ˆ˜ํ˜• ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ๋Š” ํ˜ธ์ถœ ์‹œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ด๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

4. ํ”„๋กœ๊ทธ๋žจ ํ๋ฆ„ ์ œ์–ด : ์„œ๋ธŒ๋ฃจํ‹ด์„ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด๊ฐ€ ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ๋„˜์–ด๊ฐ”๋‹ค๊ฐ€, ์„œ๋ธŒ๋ฃจํ‹ด์ด ๋๋‚˜๋ฉด ์›๋ž˜ ํ˜ธ์ถœํ•œ ์œ„์น˜๋กœ ๋Œ์•„์˜จ๋‹ค. ์ด๋•Œ CALL ๋ช…๋ น์–ด๋กœ ์„œ๋ธŒ๋ฃจํ‹ด์„ ํ˜ธ์ถœํ•˜๊ณ , RET ๋ช…๋ น์–ด๋กœ ๋ณต๊ท€ํ•œ๋‹ค.

5. ์Šคํƒ๊ณผ ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์šฉ: ์„œ๋ธŒ๋ฃจํ‹ด ํ˜ธ์ถœ ์‹œ, ํ˜ธ์ถœํ•œ ์œ„์น˜๋ฅผ ๊ธฐ์–ตํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœ ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์Šคํƒ์„ ์‚ฌ์šฉํ•œ๋‹ค. ํŠนํžˆ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด์—์„œ๋Š” ์„œ๋ธŒ๋ฃจํ‹ด ํ˜ธ์ถœ ์‹œ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ ์Šคํƒ์— ์ €์žฅํ•˜๊ณ , ๋ณต๊ท€ ์‹œ ์ด ๊ฐ’์„ ๋ณต์›ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

 

 ๐Ÿฅ ์„œ๋ธŒ๋ฃจํ‹ด ๋ช…๋ น์–ด

x86-32 ์ปดํ“จํ„ฐ์—์„œ์˜ ์„œ๋ธŒ๋ฃจํ‹ด

- CALL ๋ช…๋ น์–ด (์„œ๋ธŒ๋ฃจํ‹ด ํ˜ธ์ถœ)

CALL ๋ช…๋ น์–ด๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ช…๋ น์–ด๋‹ค. ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์–ด์˜ ๋‹ค์Œ ์ฃผ์†Œ(๋ณต๊ท€ ์ฃผ์†Œ)๋ฅผ ์Šคํƒ์— ์ €์žฅํ•œ๋‹ค.

๋™์ž‘ ๊ณผ์ •:
- ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ์Šคํƒ์— ์ €์žฅ
- ์„œ๋ธŒ๋ฃจํ‹ด์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋กœ ์ ํ”„
- ์„œ๋ธŒ๋ฃจํ‹ด์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ์ฝ”๋“œ ๋ธ”๋ก ์‹คํ–‰

 

- RET ๋ช…๋ น์–ด (์„œ๋ธŒ๋ฃจํ‹ด ๋ณต๊ท€)

RET ๋ช…๋ น์–ด๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋œ ํ›„ ์›๋ž˜ ํ˜ธ์ถœ๋œ ์œ„์น˜๋กœ ๋Œ์•„๊ฐ€๋Š” ๋ช…๋ น์–ด์ด๋‹ค. ์Šคํƒ์— ์ €์žฅ๋œ ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ๊บผ๋‚ด ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ๊ทธ ์ฃผ์†Œ๋กœ ๋˜๋Œ๋ฆฐ๋‹ค.

๋™์ž‘ ๊ณผ์ •:
- ์Šคํƒ์—์„œ ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ๊บผ๋‚ด์–ด PC์— ์ €์žฅ
- PC์— ์ €์žฅ๋œ ์ฃผ์†Œ๋กœ ์ด๋™ํ•˜์—ฌ ์›๋ž˜ ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ๊ณ„์† ์‹คํ–‰

 

 โ›ˆ๏ธ ์„œ๋ธŒ๋ฃจํ‹ด ๋™์ž‘ ๊ณผ์ •

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

2. ์„œ๋ธŒ๋ฃจํ‹ด ์‹คํ–‰: ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด์˜ ์ง€์—ญ ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์Šคํƒ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ์„œ๋ธŒ๋ฃจํ‹ด์€ ์ฃผ์–ด์ง„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ๋ณต๊ท€ ์ค€๋น„๋ฅผ ํ•œ๋‹ค.

3. ์„œ๋ธŒ๋ฃจํ‹ด ๋ณต๊ท€: ์„œ๋ธŒ๋ฃจํ‹ด์ด ์™„๋ฃŒ๋œ ํ›„ RET ๋ช…๋ น์–ด๋ฅผ ๋งŒ๋‚˜๋ฉด, ์Šคํƒ์—์„œ ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ๊บผ๋‚ด PC์— ์ €์žฅํ•œ๋‹ค. PC๋Š” ๋ณต๊ท€ ์ฃผ์†Œ๋กœ ์ด๋™ํ•˜์—ฌ ์›๋ž˜ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ์žฌ๊ฐœํ•œ๋‹ค.

 

์Šคํƒ ์‚ฌ์šฉ

- ์„œ๋ธŒ๋ฃจํ‹ด ํ˜ธ์ถœ ์‹œ ์Šคํƒ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ์†Œํ•˜๊ณ ,
- ๋ณต๊ท€ ์‹œ ์Šคํƒ ํฌ์ธํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ ์„œ๋ธŒ๋ฃจํ‹ด ์ค‘์ฒฉ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๐Ÿ”– ์„œ๋ธŒ๋ฃจํ‹ด ๊ด€๋ จ ๋ ˆ์ง€์Šคํ„ฐ

IP (Instruction Pointer)

ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค. CALL ๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ IP์˜ ๊ฐ’์ด ์Šคํƒ์— ์ €์žฅ๋˜๊ณ , RET ๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ ์Šคํƒ์—์„œ ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ๊บผ๋‚ด IP์— ๋ณต์›ํ•œ๋‹ค.

 

SP (Stack Pointer)

์Šคํƒ์˜ ์ตœ์ƒ๋‹จ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์Šคํƒ์— ๋ฐ์ดํ„ฐ๋ฅผ ํ‘ธ์‹œ(push)ํ•  ๋•Œ SP๋Š” ๊ฐ์†Œํ•˜๊ณ , ํŒ(pop)ํ•  ๋•Œ SP๋Š” ์ฆ๊ฐ€ํ•œ๋‹ค. ์„œ๋ธŒ๋ฃจํ‹ด ํ˜ธ์ถœ ์‹œ CALL ๋ช…๋ น์–ด๋Š” IP์˜ ๊ฐ’์„ ์Šคํƒ์— ์ €์žฅํ•˜๊ณ  SP๋ฅผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

 


 BP (Base Pointer)

์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ”„๋ ˆ์ž„์˜ ๊ธฐ์ค€์  ์—ญํ• ์„ ํ•œ๋‹ค. ์„œ๋ธŒ๋ฃจํ‹ด ์‹œ์ž‘ ์‹œ BP๋Š” SP์˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ ์ด์ „์˜ SP ๊ฐ’์„ ๋ณต์›ํ•˜์—ฌ ์Šคํƒ์„ ์‰ฝ๊ฒŒ ๋ณต๊ตฌํ•œ๋‹ค.

 

๐Ÿ“ ์Šคํƒ ์‚ฌ์šฉ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์—์„œ ์Šคํƒ์€ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ž๋ผ๋ฉฐ, ๋†’์€ ์ฃผ์†Œ์—์„œ ๋‚ฎ์€ ์ฃผ์†Œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

์˜ˆ์‹œ

์Šคํƒ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ๊ฐ€์ •ํ•ด ๋ณด์ž:
- SP = 0x1000
- IP = 0x2000

CALL subroutine ์‹คํ–‰ ์‹œ IP์˜ ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ์Šคํƒ์— ํ‘ธ์‹œํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด SP๋Š” ๊ฐ์†Œํ•˜๊ณ , ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ์ ํ”„ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

๐Ÿ–ผ๏ธ ์Šคํƒ ํ”„๋ ˆ์ž„ ํ™œ์šฉ

์„œ๋ธŒ๋ฃจํ‹ด์ด ํ˜ธ์ถœ๋  ๋•Œ, ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์™€ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์Šคํƒ์— ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์Šคํƒ ํ”„๋ ˆ์ž„์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด ์˜์—ญ์€ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ ๋ณ€์ˆ˜, ๋ณต๊ท€ ์ฃผ์†Œ, ์ €์žฅ๋œ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

์Šคํƒ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ

- ๋งค๊ฐœ๋ณ€์ˆ˜: ํ˜ธ์ถœ๋œ ์„œ๋ธŒ๋ฃจํ‹ด์— ์ „๋‹ฌ๋œ ๊ฐ’
- ๋ณต๊ท€ ์ฃผ์†Œ: ์„œ๋ธŒ๋ฃจํ‹ด ์ข…๋ฃŒ ํ›„ ๋Œ์•„๊ฐˆ ์ฃผ์†Œ
- ์ด์ „ BP: ์ด์ „ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์˜ BP ๊ฐ’
- ์ง€์—ญ ๋ณ€์ˆ˜: ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ž„์‹œ ๋ณ€์ˆ˜

 

์—ญํ• 

- ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ: ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„ ์ด์ „ ํ•จ์ˆ˜์˜ ์ƒํƒœ(๋ณต๊ท€ ์ฃผ์†Œ, ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’)๋ฅผ ์ €์žฅํ•˜๊ณ , ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•  ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•œ๋‹ค.
- ๋ณต๊ท€ ์ฃผ์†Œ ์ €์žฅ: ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์œ„์น˜๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค.
- ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์ง€์—ญ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ: ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜์—ฌ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

 

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

int add(int a, int b) {
    int result = a + b;
    return result;
}

int main() {
    int sum = add(3, 4);
    return 0;
}

 

์ด ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์ง์ ‘ ๊ทธ๋ ค๋ณด๋ฉฐ ๊ณต๋ถ€ํ•˜์‹œ๋ผ...