MIPS ๋”ฅ๋‹ค์ด๋ธŒ ๐Ÿ“ช

Borยท2021๋…„ 10์›” 10์ผ
1

์ปดํ“จํ„ฐ๊ตฌ์กฐ

๋ชฉ๋ก ๋ณด๊ธฐ
3/15

2.5 ๋…ผ๋ฆฌ์—ฐ์‚ฐ ๋ช…๋ น์–ด

๋ฐฐ๊ฒฝ: ๐Ÿ–ณ์ดˆ๊ธฐ์˜์ปดํ“จํ„ฐ๐Ÿ–ณ๋Š” ์›Œ๋“œ ์ „์ฒด์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ์—๋งŒ ๊ด€์‹ฌ์„ ๊ฐ€์กŒ์ง€๋งŒ, ์›Œ๋“œ ๋‚ด ์ผ๋ถ€ ๋น„ํŠธ๋“ค์— ๋Œ€ํ•œ ์—ฐ์‚ฐ, ์‹ฌ์ง€์–ด ํ•˜๋‚˜ ํ•˜๋‚˜์˜ ๋น„ํŠธ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ๋„ ํ•„์š”ํ•ด์กŒ๋‹ค. (์ธ๊ฐ„์˜ ์š•์‹ฌ์€ ๋์ด ์—†๊ณ ...) ์›Œ๋“œ ๋‚ด์— 8๋น„ํŠธ๋กœ ์ €์žฅ๋œ ๋ฌธ์ž๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์ž‘์—…์ด ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์˜ ํ•œ ์˜ˆ์ด๋‹ค. ๋’ค๋ฅผ ์ด์–ด, ๐Ÿ“ฆ๏ธŽ๋น„ํŠธ๋ฅผ ์›Œ๋“œ๋กœ ๋ฌถ๋Š” ์ž‘์—…๐Ÿ“ฆ๏ธŽ(packing)๊ณผ ์›Œ๋“œ๋ฅผ ๐Ÿ—ณ๋น„ํŠธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋Š” ์ž‘์—…๐Ÿ—ณ(unpacking) ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์ด ํ”„๋กœ๊ธ€๋ฐ ์–ธ์–ด์™€ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์— ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…๋ น์–ด๋“ค์„ ๋…ผ๋ฆฌ์—ฐ์‚ฐ ๋ช…๋ น์–ด๋ผ ๋ถ€๋ฅธ๋‹ค.

โช Shift โฉ

์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ ์ค‘ ์ฒซ ๋ฒˆ์งธ๋Š” ์ž๋ฆฌ์ด๋™ ์—ฐ์‚ฐ์ด๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” ์›Œ๋“œ ๋‚ด์˜ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ์™ผ์ชฝ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๊ณ , ์ด๋™ ํ›„์— ๋นˆ ์ž๋ฆฌ๋Š” 0์œผ๋กœ ์ฒด์šด๋‹ค.

  • 0000 0000 0000 0000 0000 0000 0000 1001(two) = 9(ten)

์ด๋ฅผ ์™ผ์ชฝ์œผ๋กœ 4๋ฒˆ ์ž๋ฆฌ์ด๋™์‹œํ‚ค๋ฉด โช

sll $t2 , $s0, 4 #reg $t2 = reg $ << 4 bits
  • 0000 0000 0000 0000 0000 0000 1001 0000(two) = 144(ten)

์ด ๋œ๋‹ค.

MIPS์—์„œ๋Š” ์ด ๋ช…๋ น์–ด๋“ค์„ sll(shift left logical) srl(shift right logical)๋กœ ๋ถ€๋ฅธ๋‹ค. ์ด์ œ ์•ž์„œ ๋ฏธ๋ค„๋’€๋˜ โœณ shamt โœณ ์ด ๋“ฑ์žฅํ•œ๋‹ค. ์ด๋Š” ์ž๋ฆฌ ์ด๋™๋Ÿ‰(shift amount)์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ ์œ„์˜ ๋ช…๋ น์–ด์—์„œ shamt์€ 4๊ฐ€ ๋œ๋‹ค.

๐Ÿง ์œ„์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ณด๋ฉด, ๋‹จ์ˆœํ•œ ์ด๋™์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. sll(โช)์€ 2^i๋ฅผ ๊ณฑํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋œ๋‹ค.


โš  AND & OR & NOT โš 

๋˜ ๋‹ค๋ฅธ ์œ ์šฉํ•œ ์—ฐ์‚ฐ์€ AND์ด๋‹ค. AND์—ฐ์‚ฐ์€ ๋น„ํŠธ ๋Œ€ ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋กœ ๋‘ ๋น„ํŠธ ๊ฐ’์ด ๋ชจ๋‘ 1์ผ ๊ฒฝ์šฐ์—๋งŒ ๊ฒฐ๊ณผ๊ฐ€ 1์ด ๋œ๋‹ค. ์ด์™€ ๋ฐ˜๋Œ€๋กœ, OR ์—ฐ์‚ฐ์ž๋Š” 1์ด ํ•˜๋‚˜๋งŒ ํฌํ•จ๋˜์–ด ์žˆ๋”๋ผ๋„ 1์ด ๋œ๋‹ค. NOT ์—ฐ์‚ฐ์€ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๋น„ํŠธ๊ฐ€ 0์ด๋ฉด 1, 1์ด๋ฉด 0์œผ๋กœ ๋งŒ๋“ ๋‹ค. MIPS์˜ ์„ค๊ณ„์ž๋“ค์€ ์œ„์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ 3-ํ”ผ์—ฐ์‚ฐ์ž ํ˜•์‹์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ NOR๋ช…๋ น์–ด๋ฅผ ํฌํ•จ์‹œ์ผฐ๋‹ค. NOR0 = NOT(A OR 0) = NOT(A)๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


2.6 โš– ํŒ๋‹จ์„ ์œ„ํ•œ ๋ช…๋ น์–ด โš–

์ปดํ“จํ„ฐ๊ฐ€ ๋‹จ์ˆœํ•œ ๊ณ„์‚ฐ๊ธฐ์™€ ๋‹ค๋ฅธ ์ ์€ ํŒ๋‹จ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋‚˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ๋ณดํ†ต if ๋ฌธ์œผ๋กœ ํŒ๋‹จ ๊ธฐ๋Šฅ์„ ํ‘œํ˜„ํ•œ๋‹ค.

beq register1, register2, L1 

beq(branch if equal)๋Š” ๋ ˆ์ง€์Šคํ„ฐ1๊ณผ ๋ ˆ์ง€์Šคํ„ฐ2์˜ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด L1์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์žฅ์œผ๋กœ ๊ฐ€๋ผ๋Š” ๋œป์ด๋‹ค.

bne register1, register2, L1 

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” bne(branch if not equal)๋กœ ๋‘ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๊ฐ™์ง€ ์•Š์œผ๋ฉด L1์œผ๋กœ ๊ฐ€๋ผ๋Š” ๋œป์ด๋‹ค. ์ด ๋‘ ๋ช…๋ น์–ด๋ฅผ ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์˜ˆ์ œ if-then-else๋ฅผ ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ๋กœ ๋ฒˆ์—ญ 

๋‹ค์Œ ์ฝ”๋“œ์—์„œ f,g,h,i,j๋Š” ๋ณ€์ˆ˜์ด๊ณ  
๊ฐ๊ฐ์€ ๋ ˆ์ง€์Šคํ„ฐ $s0๋ถ€ํ„ฐ $s4๊นŒ์ง€์— ํ•ด๋‹นํ•œ๋‹ค. ์ปดํŒŒ์ผํ•œ ์ฝ”๋“œ๋Š”? 

if (i == j) f = g + h ; else f = g - h;

bne $s3, $s4, Else 

add $s0, $s1, $s2 

์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ํ›„์—๋Š” if๋ฌธ์žฅ์˜ ์ ค ๋์œผ๋กœ ๊ฐ€์•ผํ•œ๋‹ค. 
์ด๊ฒƒ์€ ๋ฌด์กฐ๊ฑด ๋ถ„๊ธฐ๋ผ๋Š” ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๋ถ„๊ธฐ๋กœ ํ•ด๊ฒฐ. 
์ด ๋ช…๋ น์–ด๋Š” ํ”„๋กœ์„ธ์„œ์—๊ฒŒ ํ•˜์ƒ ๋ถ„๊ธฐํ•˜๋ผ๊ณ  ๋งํ•œ๋‹ค. 
MIPS์—์„œ๋Š” ์ด ๊ฐ™์€ ๋ช…๋ น์–ด์— jump๋ผ๋Š” ์ด๋ฆ„์„ ๋ถ™์ด๊ณ 
j๋กœ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค. 

ํ•˜๋“œ์›จ์–ด, ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค

๊ฐ™์€์ง€ ๋‹ค๋ฅธ์ง€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ๋Œ€์†Œ ๋น„๊ต๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋„ ์žˆ๋‹ค. for ์ˆœํ™˜๋ฌธ ๋“ฑ์—์„œ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜ ๊ฐ’์ด 0๋ณด๋‹ค ์ž‘์€์ง€ ๊ฒ€์‚ฌํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. slt(set on less than) ๋ช…๋ น์–ด๋Š” ๋‘ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ ๋น„๊ตํ•œ ํ›„ ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์ด ๋‘ ๋ฒˆ์งธ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์„ธ ๋ฒˆ์งธ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ 1, ์•„๋‹ˆ๋ฉด 0์œผ๋กœ ํ•˜๋Š” ๋ช…๋ น์–ด๋กœ ์ด๋Ÿฐ ์ผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

slt $t0, $s3, $s4 #t0 = 1 if $s3 < $s4

์ƒ์ˆ˜ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋น„๊ต์—์„œ๋„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿด ๋•Œ๋Š” i๋ฅผ ์‚ดํฌ์‹œ ๋ถ™์—ฌ์„œ slti๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


2.7 ํ•˜๋“œ์›จ์–ด์˜ ํ”„๋กœ์‹œ์ € ์ง€์›

๐Ÿ“ฃํ”„๋กœ์‹œ์ €(procedure)๋‚˜ ํ•จ์ˆ˜๋Š” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  โ™ป ์žฌ์‚ฌ์šฉ โ™ป์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์•ž์„œ ์‚ดํŽด๋ณธ ์ถ”์ƒํ™”(abstraction)๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค. ํ”„๋กœ์‹œ์ €๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ•œ ๋ฒˆ์— ํ•œ ๋ถ€๋ถ„์”ฉ ์ง‘์ค‘ํ•ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

๐Ÿ“ฃ์ธ์ˆ˜(parameter)๋Š”์‹œ์ €์— ๊ฐ’์„ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ผ์„ ํ•˜๋ฏ€๋กœ, ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„ ๋ฐ ๋ฐ์ดํ„ฐ์™€ ํ”„๋กœ์‹œ์ € ์‚ฌ์ด์˜ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•œ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์ด ํ”„๋กœ์‹œ์ €๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฌ์„ฏ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค.

  1. ํ”„๋กœ์‹œ์ €๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์— ์ธ์ˆ˜๋ฅผ ๋„ฃ๋Š”๋‹ค
  2. ํ”„๋กœ์‹œ์ €๋กœ ์ œ์–ด๋ฅผ ๋„˜๊ธด๋‹ค.
  3. ํ”„๋กœ์‹œ์ €๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ํš๋“ํ•œ๋‹ค.
  4. ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  5. ํ˜ธ์ถœํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์†Œ์— ๊ฒฐ๊ณผ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
  6. ํ”„๋กœ์‹œ์ €๋Š” ํ”„๋กœ๊ทธ๋žจ ๋‚ด์˜ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์›๋ž˜ ์œ„์น˜๋กœ ์ œ์–ด๋ฅผ ๋Œ๋ ค์ค€๋‹ค.

์•ž์„œ, ๊ณต๋ถ€ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๊ณณ์ด๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ทธ๋ž˜์„œ MIPS๋Š” ๊ด€๋ก€์— ๋”ฐ๋ผ ๋ ˆ์ง€์Šคํ„ฐ 32๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

  • a$0 - a$3: ์ „๋‹ฌํ•  ์ธ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธ์ˆ˜ ๋ ˆ์ง€์Šคํ„ฐ 4๊ฐœ
  • $v0 - $v1: ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ฐ’ ๋ ˆ์ง€์Šคํ„ฐ 2๊ฐœ
  • $ra: ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๊ธฐ ์œ„ํ•œ ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ ˆ์ง€์Šคํ„ฐ 1๊ฐœ

์ดํ›„์—๋Š” ํ‚ค์›Œ๋“œ ์ค‘์‹ฌ์œผ๋กœ ํ”„๋กœ์‹œ์ € ๋ช…๋ น์–ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!

โคต๏ธ Jal ๋ช…๋ น์–ด(return address) โคต๏ธ

MIPS ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋Š” ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ• ๋‹นํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”„๋กœ์‹œ์ €๋ฅผ ์œ„ํ•œ ๋ช…๋ น์–ด๋„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ ์˜ˆ๊ฐ€ ์ง€์ •ํ•œ ์ฃผ์†Œ๋กœ ์ ํ”„ํ•˜๋ฉด์„œ ๋™์‹œ์— ๋‹ค๋ฅธ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ra๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•˜๋Š” ๋ช…๋ น์–ด๋กœ jal ๋ช…๋ น์–ด (jump - and - link instruction)๋ผ ๋ถ€๋ฅธ๋‹ค.

โ†ฉ๏ธ ๋ณต๊ท€์ฃผ์†Œ(return address) โ†ฉ๏ธ

์ด๋ฆ„์—์„œ link๋Š” ํ”„๋กœ์‹œ์ € ์ข…๋ฃŒ ํ›„ ์˜ฌ๋ฐ”๋ฅธ ์ฃผ์†Œ๋กœ ๋˜๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ˜ธ์ถœํ•œ ๊ณณ๊ณผ ํ”„๋กœ์‹œ์ € ์‚ฌ์ด์— ์ฃผ์†Œ ๋˜๋Š” ๋งํฌ๋ฅผ ํ˜•์„ฑํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ $ra(๋ ˆ์ง€์Šคํ„ฐ31)์— ๊ธฐ์–ต๋˜๋Š” ์ด ๋งํฌ๋ฅผ ๋ณต๊ท€ ์ฃผ์†Œ(return address)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ•œ ํ”„๋กœ์‹œ์ €๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ณต๊ท€ ์ฃผ์†Œ๋Š” ๊ผญ ํ•„์š”ํ•˜๋‹ค.

โคด๏ธ Jr ๋ช…๋ น์–ด(jump register) โคด๏ธ

์•ž์„œ ์‚ดํŽด๋ณธ ๋งํฌ์™€ ๋ณต๊ท€๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„œ MIPS๋Š” jr๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋˜ ์ฃผ์†Œ๋กœ ๋ฌด์กฐ๊ฑด ์ ํ”„ํ•˜๋ผ๋Š” ๋œป์ด๋‹ค.

jr $ra ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. 

์œ„ ๋ช…๋ น์–ธ๋Š ๋ ˆ์ง€์Šคํ„ฐ $ra์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ฃผ์†Œ๋กœ ์ ํ”„ํ•˜๋ผ๋Š” ๋œป์ด๋‹ค. ํ˜ธ์ถœํ”„๋กœ๊ทธ๋žจ(caller)์€ $a0 - $a3์— ์ „๋‹ฌํ•œ ์ธ์ˆ˜ ๊ฐ’์„ ๋„ฃ์€ ํ›„ jal x๋ช…๋ น์„ ์ด์šฉํ•ด์„œ ํ”„๋กœ์‹œ์ €(ํ•จ์ˆ˜) X(ํ”ผํ˜ธ์ถœ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ, callee๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค)๋กœ ์ ํ”„ํ•œ๋‹ค. callee๋Š” ๊ณ„์‚ฐ์„ ๋๋‚ธ ํ›„ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ $v0 - $v1์— ์–บ์€ ํ›„ jr $ra ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋ณต๊ท€ํ•œ๋‹ค.

์ ‘๋ชฉ!
๋‚ด์žฅ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋…์€ ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ธ ๋ช…๋ น์–ด์˜์ฃผ์†Œ๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค. ์ด ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ด๋ฆ„์€ ๋ช…๋ น์–ด ์ฃผ์†Œ ๋ ˆ์ง€์Šคํ„ฐ(instruction address register)๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•˜์ง€๋งŒ ๋ณดํ†ต ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ (program counter, PC)๋ผ ๋ถ€๋ฅธ๋‹ค. jal ๋ช…๋ น์€ ํ”„๋กœ์‹œ์ €์—์„œ ๋ณต๊ท€ํ•  ๋Œ€ ๋‹ค์Œ ๋ช…๋ น์–ด๋ถ€ํ„ฐ ์‹คํ–‰๋˜๋„๋ก PC + 4๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ $ra์— ์ €์žฅํ•œ๋‹ค.


๋” ๋งŽ์€ ๋ ˆ์ง€์Šคํ„ฐ์˜ ์‚ฌ์šฉ

์ปดํผ์ผ๋Ÿฌ๊ฐ€ ํ”„๋กœ์‹œ์ €๋ฅผ ๋ฒˆ์—ญํ•˜๋Š” ๋ฐ ์ธ์ˆ˜ ๋ ˆ์ง€์Šคํ„ฐ 4๊ฐœ, ๊ฒฐ๊ณผ ๊ฐ’ ๋ ˆ์ง€์Šคํ„ฐ 2๊ฐœ ๋งŒ์œผ๋กœ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์ด ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉด ์•ˆ ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณต๊ท€ํ•˜๊ธฐ ์ „์— ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ ์ „์˜ ์ƒํƒœ๋กœ ๋˜๋Œ๋ ค ๋†“์•„์•ผ ํ•œ๋‹ค. (๋ ˆ์ง€์Šคํ„ฐ ์Šคํ•„๋ง!)

๋ ˆ์ง€์Šคํ„ฐ ์Šคํ•„๋ง์— ์ด์ƒ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์Šคํƒ(stack)์ด๋‹ค. ์Šคํƒ์€ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๊ฒƒ์ด ๋จผ์ € ๋‚˜์˜ค๋Š” (LIFO) ๊ตฌ์กฐ์ด๋‹ค. ์Šคํƒ์—์„œ๋Š” ๋‹ค์Œ ํ”„๋กœ์‹œ์ €๊ฐ€ ์Šคํ•„ํ•  ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ €์žฅํ•  ์žฅ์†Œ๋‚˜ ๋ ˆ์ง€์Šคํ„ฐ์œผ ์˜›๋‚  ๊ฐ’์ด ์ €์žฅ๋œ ์žฅ์†Œ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ตœ๊ทผ์— ํ• ๋‹น๋œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ์Šคํƒ ํฌ์ธํ„ฐ ๋“ฑ์žฅ! ์ด ์Šคํƒ ํฌ์ธํ„ฐ(stack pointer)๋Š” ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’ ํ•˜๋‚˜๊ฐ€ ์Šคํƒ์ด ๋˜๊ฑฐ๋‚˜ ์Šคํƒ์—์„œ ๋ณต๊ตฌ๋  ๋•Œ๋งˆ๋‹ค ํ•œ ์›Œ๋“œ์”ฉ ์กฐ์ •๋œ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ 29๋ฅผ ํ• ๋‹นํ•ด ๋†“๊ณ  ์žˆ๋Š”๋ฐ ์ด๋ฆ„์€ $sp์ด๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ ์™€์˜ ์—ฐ!๊ฒฐ!๊ณ !๋ฆฌ ์Šคํƒ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ์ž‘์—…์„ ํ‘ธ์‹œ(push), ์Šคํƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ์ž‘์—…์„ ํŒ(pop)์ด๋ผ๊ณ  ํ•œ๋‹ค. ์Šคํƒ์€ ๋†’์€ ์ฃผ์†Œ์—์„œ ๋‚ฎ์€ ์ชฝ์œผ๋กœ ์„ฑ์žฅํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐ˜์ง๊ด€์ ์œผ๋กœ ๋Š๊ปด์ง€์ง€๋งŒ ํ‘ธ์‹œ๋ฅผ ํ•  ๋•๋Š ์ฃผ์†Œ๋ฅผ ๊ฐ์†Œ์‹œ์ผœ์•ผ ํ•˜๊ณ , ์Šคํƒ์—์„œ ํŒ์„ ํ•  ๋•Œ๋Š” ํฌ์ธํ„ฐ ๊ฐ’์„ ์ฆ๊ฐ€์‹œ์ผœ์•ผ ํ•œ๋‹ค. (๊ฐ‘์ž๊ธฐ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋‚˜์™€์„œ ๋‹นํ™ฉ์Šค๋Ÿฝ์ง€๋งŒ keep calm and keep going)

int leaf_example(int g, int h, int i, int j) {
    int f;

    f = (g + h) - (i + j);
    return f;
}
leaf_example:
์šฐ์„  ํ”„๋กœ์‹œ์ € ๋ ˆ์ด๋ธ”๋กœ ์‹œ์ž‘๋œ๋‹ค. 

============================================================
    addi $sp, $sp, -12(4*3)          # 3๊ฐœ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ €์žฅํ•  ์ž๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค. 
    sw $t1, 8($sp)              # ๋‚˜์ค‘์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ $t1 ์ €์žฅ
    sw $t0, 4($sp)              # ๋‚˜์ค‘์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ $t0 ์ €์žฅ
    sw $s0, 0($sp)              # ๋‚˜์ค‘์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ $s0 ์ €์žฅ
    ======================================================
    add $t0, $a0, $a1           # $t0 = g + h
    add $t1, $a2, $a3           # $t1 = i + j
    sub $s0, $t0, $t1           # f = $t0 - $t1 = (g + h) - (i + j)
    add $v0, $s0, $zero         # return f

============================================================   
    lw $s0, 0($sp)              # caller๋ฅผ ์œ„ํ•ด $s0์„ loadํ•œ๋‹ค.
    lw $t0, 4($sp)              # caller๋ฅผ ์œ„ํ•ด $t0์„ loadํ•œ๋‹ค.
    lw $t1, 8($sp)              # caller๋ฅผ ์œ„ํ•ด $t1์„ loadํ•œ๋‹ค.
    addi $sp, $sp, 12           # ๋˜๋Œ์•„์˜ค๊ธฐ ์ „์— ์ €์žฅํ•ด ๋‘์—ˆ๋˜ ๊ฐ’์„ ์Šคํƒ์—์„œ ๊บผ๋‚ด ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์›์ƒ ๋ณต๊ตฌํ•œ๋‹ค. 
    
    ===========================================================
    jr $ra                      # ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ์“ธ๋ฐ์—†์ด ์ €์žฅํ–ˆ๋‹ค ๋ณต๊ตฌํ•˜๋Š” ์ผ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด MIPS ์†Œํ”„ํŠธ์›จ์–ด๋Š” ๋ ˆ์ง€์Šคํ„ฐ 18๊ฐœ๋ฅผ ๋‘ ์ข…๋ฅ˜๋กœ ๋‚˜๋ˆˆ๋‹ค.

  • $t0 ~ $t9: ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ ์‹œ, ํ”ผํ˜ธ์ถœ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ’์„ ๋ณด์กดํ•ด ์ฃผ์ง€ ์•Š๋Š” ์ž„์‹œ ๋ ˆ์ง€์Šคํ„ฐ
  • $s0 ~ $s7: ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ ์ „๊ณผ ํ›„์˜ ๊ฐ’์ด ๊ฐ™๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š” ๋ณ€์ˆ˜ ๋ ˆ์ง€์Šคํ„ฐ 8๊ฐœ

์ด๋Ÿฐ ๊ด€๋ก€๋Š” ๋ ˆ์ง€์Šคํ„ฐ ์Šคํ•„๋ง์„ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. $t0 ~ $t9๋Š” ํ˜ธ์ถœ ์ „ํ›„ ๊ฐ™์€ ๊ฐ’์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅ/์ ์žฌ ๋ช…๋ น์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.


์ค‘์ฒฉ๋œ ํ”„๋กœ์‹œ์ €

๐Ÿ“ฃ ๋ง๋‹จ(leaf) ํ”„๋กœ์‹œ์ €๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ๋งํ•œ๋‹ค. ๋ง๋‹จ ํ”„๋กœ์‹œ์ €๋งŒ ์žˆ๋‹ค๋ฉด ์ผ์ด ์‰ฝ๊ฒ ์ง€๋งŒ ๊ณต๋ถ€ํ•˜๋Š” ์šฐ๋ฆฌ์˜ ๋ฐ”๋žŒ๊ณผ ๋‹ฌ๋ฆฌ ๊ทธ๋ ‡์ง€ ๋ชปํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋‹ค๋ณด๋ฉด ์ž์ฃผ ๋งˆ์ฃผํ•˜๋Š” ์ƒํ™ฉ์ด์ง€๋งŒ ํ”„๋กœ์‹œ์ €๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ฌ์ง€์–ด ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๐Ÿ“ฃ์žฌ๊ท€ ํ”„๋กœ์‹œ์ €๋„ ์กด์žฌํ•œ๋‹ค.

nt fact(int n) {
    if (n < 1) {
        return 1;
    } else {
        return (n * fact(n-1));
    }
}
============================================================ 
fact:
    addi $sp, $sp, -8       # 2๊ฐœ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„ ํ™•๋ณด
    sw $ra, 4($sp)          # ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ์ €์žฅ
    sw $a0, 0($sp)          # ์ธ์ˆ˜ n ์ €์žฅ

๐Ÿ“ฃ #fact๊ฐ€ ์ฒ˜์Œ ํ˜ธ์ถœ ๋˜์—ˆ์„ ๋•Œ sw๋Š” fact๋ฅผ ํ˜ธ์ถœํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค. 
n๋ณด๋‹ค ์ž‘์€์ง€ ๊ฒ€์‚ฌํ•ด์„œ n์ด ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋ฉด L1์œผ๋กœ ๊ฐ€๊ฒŒ ํ•˜๋Š” ๋ช…๋ น์–ด

    slti $t0, $a0, 1        # if n < 1 then $t0 = 1, else $t0 = 0
    beq $t0, $zero, L1      # if $t0 = 0 (n > = 1) then go to L1
    
๐Ÿ“ฃ#n์ด 1๋ณด๋‹ค ์ž‘์œผ๋ฉด ํŒฉํ† ๋ฆฌ์–ผ์ด๋‹ˆ๊นŒ 1์„ ๊ฐ’๋ ˆ์ง€์Šคํ„ฐ์— ๋„ฃ๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ด๋•Œ 0์—๋‹ค 1์„ ๋”ํ•ด์„œ $v0์— ๋„ฃ๋Š”๋‹ค. ๋ณต๊ท€ ์ „์— +8์„ ํ•ด์ฃผ๋ฉด์„œ ์ €์žฅ๋œ ๊ฐ’ 2๊ฐœ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์ดํ›„์— ๋ณต๊ท€ ์ฃผ์†Œ๋กœ ์ ํ”„ํ•œ๋‹ค. 

    addi $v0, $zero, 1      # return 1
    addi $sp, $sp, 8        # 2๊ฐœ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์Šคํƒ์—์„œ pop
    jr $ra
============================================================ 
L1:
    addi $a0, $a0, -1       # n = n - 1
    jal fact                # fact๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

    lw $a0, 0($sp)          # ํ˜ธ์ถœํ•œ ๊ณณ์˜ ์ธ์ˆ˜ n ๊ฐ€์ ธ์˜ค๊ธฐ
    lw $ra, 4($sp)          # ํ˜ธ์ถœ ์ฃผ์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ
    addi $sp, $sp, 8        # 2๊ฐœ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์Šคํƒ์—์„œ pop

    mul $v0, $a0, $v0       # $v0 = n * funct(n - 1)

    jr $ra                  # ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

ํ•˜๋“œ์›จ์–ด ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค

๋ ˆ์ง€์Šคํ„ฐ์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•  ๋งŒํผ ํฐ ๋ฐฐ์—ด์ด๋‚˜ ๊ตฌ์กฐ์ฒด ๊ฐ™์€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ๋„ ์Šคํƒ์ด ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ค์›Œ์ง„๋‹ค. ํ”„๋กœ์‹œ์ €์˜ ์ €์žฅ๋œ ๋ ˆ์ง€์Šคํ„ฐ์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์Šคํƒ ์˜์—ญ์„ ๐Ÿ“ฃํ”„๋กœ์‹œ์ € ํ”„๋ ˆ์ž„(procedure frame) ๋˜๋Š” ๐Ÿ“ฃ์•กํ‹ฐ๋ฒ ์ด์…˜ ๋ ˆ์ฝ”๋“œ(activation record)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์€ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ ์ „, ์ค‘, ํ›„์˜ ์Šคํƒ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

MIPS ์†Œํ”„ํŠธ์›จ์–ด ์ค‘์—๋Š” ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐ(frame pointer $fp)๊ฐ€ ํ”„๋กœ์‹œ์ € ํ”„๋ ˆ์ž„์˜ ์ฒซ ๋ฒˆ์งธ ์›Œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค. ์Šคํƒ ํฌ์ธํ„ฐ ๊ฐ’์ด ํ”„๋กœ์‹œ์ € ๋‚ด์—์„œ ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์ง€์—ญ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ณ€์œ„๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ”„๋กœ์‹œ์ € ์–ด๋Š ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋˜๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ˜ต ๋งŒ์•ฝ ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฒ ์ด์Šค ๋ ˆ์ง€์Šคํ„ฐ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ์ง€์—ญ ๋ณ€์ˆ˜ ์ฐธ์กฐ๊ฐ€ ๊ฐ„๋‹จํ•ด์ง„๋‹ค. ๋ณ„๋„์˜ ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐ ์‚ฌ์šฉ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์•กํ‹ฐ๋ฒ ์ด์…˜ ๋ ˆ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ์Šคํƒ์— ์กด์žฌํ•จ์— ์œ ์˜ํ•˜๋ž‘. ๐Ÿ˜ต


์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ํž™ ๊ณต๊ฐ„์˜ ํ• ๋‹น

Stack

์ตœ์ƒ์œ„ ์ฃผ์†Œ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์•„๋ž˜์ชฝ์œผ๋กœ ์ž๋ž€๋‹ค.

Dynamic Data

ํž™(Heap)์„ ์‚ฌ์šฉํ•œ๋‹ค. ์Šคํƒ๊ณผ ํž™์ด ์„œ๋กœ ๋งˆ์ฃผ ๋ณด๋ฉฐ ์ž๋ผ๋„๋ก ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. C๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํž™์˜ ๊ณต๊ฐ„์„ ํ• ๋‹น ๋ฐ›๊ธฐ๋„, ๋Œ๋ ค์ฃผ๊ธฐ๋„ ํ•œ๋‹ค. (malloc(), free()) ๊ทผ๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐ˜๋‚ฉ์„ ์žŠ์–ด๋ฒ„๋ฆฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ถœ(memory leak)์ด ๋ฐœ์ƒํ•ด ์šด์˜์ฒด์ œ๊ฐ€ ๋ถ•๊ดด๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋„ˆ๋ฌด ์ผ์ฐ ๋ฐ˜๋‚ฉํ•˜๋ฉด '๋งค๋‹ฌ๋ฆฐ ํฌ์ธํ„ฐ'(dangling pointer)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. Java์—์„ ๋Š ์ด๋Ÿฐ ๋ฒ„๊ทธ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ด์šฉํ•œ๋‹ค.

Static Data ์ •์  ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ(static data segment)

์ƒ์ˆ˜์™€ ๊ธฐํƒ€ ์ •์  ๋ณ€์ˆ˜๋“ค์ด ์—ฌ๊ธฐ์— ๋“ค์–ด๊ฐ€๋ฉฐ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ณณ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐฐ์—ด์€ ๊ทธ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์–ด์„œ ์ •์  ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์— ์ž˜ ๋งž๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(linked list) ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ด๋ฏ€๋กœ ํ•œ ์ธต ๋” ์œ„์ธ dynamic data์— ๋“ค์–ด๊ฐ„๋‹ค.

Text

MIPS ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„์ด๋ฉฐ ํ…์ŠคํŠธ ์„ธ๊ทธ๋จผํŠธ(text segment)๋ผ ๋ถ€๋ฅธ๋‹ค.

Reserved

์ตœํ•˜์œ„ ์ฃผ์†Œ๋ถ€๋ถ„์€ ์‚ฌ์šฉ์ด ์œ ๋ณด๋˜์–ด ์žˆ๋‹ค.

<์ฐธ๊ณ > MIPS ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์˜ ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์šฉ ๊ด€๋ก€
The 32 MIPS registers are partitioned as follows:

  • Register 0 : $zero always stores the constant 0
  • Regs 2-3 : $v0, $v1 return values of a procedure
  • Regs 4-7 : a0โˆ’a0-a3 input arguments to a procedure
  • Regs 8-15 : t0โˆ’t0-t7 temporaries #๊ตณ์ด ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ€์ง€๊ณ  ๊ฐˆ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • Regs 16-23: s0โˆ’s0-s7 variables
  • Regs 24-25: t8โˆ’t8-t9 more temporaries
  • Reg 28 : $gp global pointer
  • Reg 29 : $sp stack pointer
  • Reg 30 : $fp frame pointer
  • Reg 31 : $ra return address

2.8 MIPS์˜ 32๋น„ํŠธ ์ˆ˜์น˜๋ฅผ ์œ„ํ•œ ์ฃผ์†Œ ์ง€์ • ๋ฐ ๋ณต์žกํ•œ ์ฃผ์†Œ์ง€์ • ๋ฐฉ์‹ ๐Ÿ ๏ธ

ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์ˆ˜๋Š” ๋Œ€์ฒด๋กœ ํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์€ ์ž‘์€ 16๋น„ํŠธ๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค. enough! ํ•˜์ง€๋งŒ ๋Œ€์— ๋”ฐ๋ผ์„œ๋Š” ๋” ํฐ ์ƒ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ๋ฅผ ์œ„ํ•ด MIPS๋Š” ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ƒ์œ„ 16 ๋น„ํŠธ์— ์ƒ์ˆ˜๋ฅผ ๋„ฃ๋Š” lui(load upper immediate)๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ํ•˜์œ„ 16 ๋น„ํŠผ๋Š ๊ทธ ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ๋‹ค๋ฅธ ๋ช…๋ น์œผ๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค.

32๋น„ํŠธ ์ƒ์ˆ˜์˜ ๋กœ๋”ฉ

๋ ˆ์ง€์Šคํ„ฐ $s0์— ๋‹ค์Œ 32๋น„ํŠธ ์ƒ์ˆ˜๋ฅผ ์ฑ„์šฐ๋Š” MIPS ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ผ. 
0000 0000 0011 1101 0000 1001 0000 0000

๐Ÿ“ฃ ๋จผ์ € lui๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์œ„ 16 ๋น„ํŠธ๋ฅผ ์ฑ„์šด๋‹ค. ๊ฐ’์€ ์‹ญ์ง„์ˆ˜๋กœ 61
lui $s0, 61             # 61 = 0000 0000 0011 110

๐Ÿ“ฃ ๋‹ค์Œ์€ ํ•˜์œ„ 16๋น„ํŠธ๋ฅผ ๋”ํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์œ„ 16๋น„ํŠธ์˜ ๊ฐ’์€ ์‹ญ์ง„์ˆ˜๋กœ 2304
ori $s0, $s0, 2304      # 2304 = 0000 1001 0000 0000

๐Ÿ“ฃ lui $s0, 61์„ ์‹คํ–‰ํ•œ ํ›„ $s0์˜ ๊ฐ’์€ 
0000 0000 0011 1101 0000 0000 0000 0000์ด ๋œ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” ํฐ ์ˆซ์ž๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ์กฐ๊ฐ€๊ธ๋กœ ๋‚˜๋ˆˆ ํ›„ ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ์žฌ์กฐ๋ฆฝ ํ•ด์•ผ ํ•œ๋‹ค. ์ˆ˜์น˜ ๋ช…๋ น์–ด์˜ ์ƒ์ˆ˜๋Š” ๋ฌผ๋ก  load๋‚˜ store์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋„ ์ƒ์ˆ˜ ํ•„๋“œ ํฌ๊ธฐ์˜ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. MIPS ์†Œํ”„ํŠธ์›จ์–ด์ฒ˜๋Ÿผ ์ด ๋ฌธ์ œ๋ฅผ ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ํฐ ๊ฐ’์„ ๋งŒ๋“ค ๋•Œ ์ž„์‹œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ์–ด์…ˆ๋ธ”๋Ÿฌ๋ฅผ ์œ„ํ•ด ์˜ˆ์•ฝ๋œ ๋ ˆ์ง€์Šคํ„ฐ $at๊ฐ€ ์ด๋Ÿฐ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.


๋ถ„๊ธฐ์™€ ์ ํ”„ ๋ช…๋ น์—์„œ์˜ ์ฃผ์†Œ ์ง€์ •

MIPS์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ฃผ์†Œ์ง€์ • ๋ฐฉ์‹์€ ์ ํ”„ ๋ช…๋ น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ ํ”„ ๋ช…๋ น์€ 6๋น„ํŠธ์˜ op์ฝ”๋“œ์™€ 26๋น„ํŠธ์˜ ์ฃผ์†Œ ํ•„๋“œ๋กœ ๊ตฌ์„ฑ๋˜๋Š” J ํƒ€์ž… ๋ช…๋ น์–ด ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ

j 10000 #go to location 10000

์„ ์–ด์…ˆ๋ธ” ํ•˜๋ฉด op์˜ ๋ถ€๋ถ„์—๋Š” 2, address์—๋Š” 10000์ด ๋“ค์–ด๊ฐ„๋‹ค.

bne s0,s0,s1, Exit #go to Exit if $s0 !== s1

์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ ๋ช…๋ น์—๋Š” ๋ถ„๊ธฐ ์ฃผ์†Œ ์™ธ์— ๋‘ ๊ฐœ์˜ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋” ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ J๋ฅผ ์“ฐ์ง€ ๋ชปํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ด์…ˆ๋ธ” ๋˜์–ด 16 ๋น„ํŠธ๋งŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

PC ์ƒ๋Œ€ ์ฃผ์†Œ์ง€์ •(PC-relative addressing)

๋งŒ์ผ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ฃผ์†Œ๊ฐ€ ์ด 16๋น„ํŠธ ํ•„๋“œ์— ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค๋ฉด, ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ๋„ 2^16๋ณด๋‹ค ๋” ์ปค์งˆ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๋„ˆ๋ฌด ์ž‘๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ? ๋Œ€์•ˆ์€ ์–ด๋–ค ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ง€์ •ํ•ด์„œ ๊ทธ ๊ฐ’์„ ๋ถ„๊ธฐ ์ฃผ์†Œ์™€ ๋”ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ–ˆ์„ ๋•Œ ๋ถ„๊ธฐ ์ฃผ์†Œ๋Š” PC = ๋ ˆ์ง€์Šคํ„ฐ + ๋ถ„๊ธฐ์ฃผ์†Œ๊ฐ€ ๋œ๋‹ค.

์ด ๋ฐฉ์‹์€ ํ”„๋กœ๊ทธ๋žจ ํฌ๊ธฐ๊ฐ€ 2^32๊นŒ์ง€ ์ปค์ง€๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋ฉด์„œ ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ๋„ ์ง€์›ํ•˜๋ฉฐ ๋ถ„๊ธฐ ์ฃผ์†Œ์˜ ํฌ๊ธฐ ์ œํ•œ์„ ๊ทน๋ณตํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ๋‚จ์€ ๋ฌธ์ œ๋Š” ์–ด๋–ค ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€์ด๋‹ค.

์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„์ด 16๊ฐœ ๋ช…๋ น์–ด ์ด์ƒ ๋–จ์–ด์ง€์ง€ ์•Š์€ ์œ„์น˜๋กœ ๋ถ„๊ธฐํ•œ๋‹ค. PC๋Š” ํ˜„ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ถ„๊ธฐ ์ฃผ์†Œ๋ฅผ ๋”ํ•  ๋ ˆ์ง€์Šคํ„ฐ๋กœ PC๋ฅผ ์„ ํƒํ•˜๋ฉด ํ˜„ ์œ„์น˜์—์„œ +-2^15์›Œ๋“œ ์ด๋‚ด ๋–จ์–ด์ง„ ๊ณณ์€ ์–ด๋””๋กœ๋“ ์ง€ ๋ถ„๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ตœ๊ทผ์˜ ๋ชจ๋“  ์ปดํ“จํ„ฐ๊ฐ€ ๊ทธ๋ ‡๋“ฏ MIPS๋„ ๋ชจ๋“  ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ ๋ช…๋ น์— PC ์ƒ๋Œ€ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ์˜ ๋ชฉ์ ์ง€๋Š” ๋Œ€๋ถ€๋ถ„ ๊ฐ€๊นŒ์šด ๊ณณ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ดํ›„์— ์‚ดํŽด๋ณด๊ฒ ์ง€๋งŒ ํ•˜๋“œ์›จ์–ด ์ž…์žฅ์—์„œ๋Š” PC๋ฅผ ์ผ์ง ์ฆ๊ฐ€์‹œ์ผœ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‹ค์ œ MIPS ์ฃผ์†Œ๋Š” ํ˜„์žฌ ๋ช…๋ น์–ด ์ฃผ์†ŒPC๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค์Œ ๋ช…๋ น์–ด ์ฃผ์†Œ PC + 4๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.

๋ฐ˜๋ฉด์—, ํ”„๋กœ์‹œ์ €๋“ค์€ ๊ฐ€๊นŒ์ด ๋ถ™์–ด ์žˆ์–ด์•ผํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค. JAL ๋ช…๋ น์€ ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์ฃผ์†Œ ์ง€์ • ๋ฐฉ์‹์„ ์ด์šฉํ•œ๋‹ค. MIPS์—์„œ j๋ช…๋ น์ด๋‚˜ jal๋ช…๋ น์–ด๊ฐ€ ๊ธด ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Jํƒ€์ž… ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

MIPS ์ฃผ์†Œ์ง€์ • ๋ฐฉ์‹ ์š”์•ฝ

์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ ์ฃผ์†Œ ํ‘œํ˜„์„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฃผ์†Œ ์ง€์ • ๋ฐฉ์‹(addressing mode)๋ผ๊ณ  ํ•œ๋‹ค.

1. ์ˆ˜์น˜(immediate) ์ฃผ์†Œ ์ง€์ •:

ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋ช…๋ น์–ด ๋‚ด์— ์žˆ๋Š” ์ƒ์ˆ˜์ด๋‹ค.

2. ๋ ˆ์ง€์Šคํ„ฐ ์ฃผ์†Œ ์ง€์ • :

ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋ ˆ์ง€์Šคํ„ฐ

3. ๋ฒ ์ด์Šค(base) ์ฃผ์†Œ์ง€์ •:

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

4. PC ์ƒ๋Œ€ ์ฃผ์†Œ์ง€์ •:

pc ๊ฐ’๊ณผ ๋ช…๋ น์–ด ๋‚ด ์ƒ์ˆ˜์˜ ํ•ฉ์„ ๋”ํ•ด์„œ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•œ๋‹ค.

5. ์˜์‚ฌ์ง์ ‘(pseudodircet) ์ฃผ์†Œ ์ง€์ •:

๋ช…๋ น์–ด ๋‚ด์˜ 26๋น„ํŠธ๋ฅผ PC์˜ ์ƒ์œ„ ๋น„ํŠธ๋“ค๊ณผ ์—ฐ์ ‘ํ•˜์—ฌ ์ ํ”„ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€