๋ฐฐ๊ฒฝ: ๐ณ์ด๊ธฐ์์ปดํจํฐ๐ณ๋ ์๋ ์ ์ฒด์ ๋ํ ์ฒ๋ฆฌ์๋ง ๊ด์ฌ์ ๊ฐ์ก์ง๋ง, ์๋ ๋ด ์ผ๋ถ ๋นํธ๋ค์ ๋ํ ์ฐ์ฐ, ์ฌ์ง์ด ํ๋ ํ๋์ ๋นํธ์ ๋ํ ์ฐ์ฐ๋ ํ์ํด์ก๋ค. (์ธ๊ฐ์ ์์ฌ์ ๋์ด ์๊ณ ...) ์๋ ๋ด์ 8๋นํธ๋ก ์ ์ฅ๋ ๋ฌธ์๋ฅผ ๊ฒ์ฌํ๋ ์์ ์ด ์ด๋ฌํ ์ฐ์ฐ์ ํ ์์ด๋ค. ๋ค๋ฅผ ์ด์ด, ๐ฆ๏ธ๋นํธ๋ฅผ ์๋๋ก ๋ฌถ๋ ์์ ๐ฆ๏ธ(packing)๊ณผ ์๋๋ฅผ ๐ณ๋นํธ ๋จ์๋ก ๋๋๋ ์์ ๐ณ(unpacking) ์ ๊ฐ๋จํ๊ฒ ํ๋ ๋ช ๋ น์ด๋ค์ด ํ๋ก๊ธ๋ฐ ์ธ์ด์ ๋ช ๋ น์ด ์งํฉ์ ์ถ๊ฐ๋์๋ค. ์ด๋ฌํ ๋ช ๋ น์ด๋ค์ ๋ ผ๋ฆฌ์ฐ์ฐ ๋ช ๋ น์ด๋ผ ๋ถ๋ฅธ๋ค.
์ด๋ฌํ ์ฐ์ฐ ์ค ์ฒซ ๋ฒ์งธ๋ ์๋ฆฌ์ด๋ ์ฐ์ฐ์ด๋ค. ์ด ๋ช ๋ น์ด๋ ์๋ ๋ด์ ๋ชจ๋ ๋นํธ๋ฅผ ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์ํค๊ณ , ์ด๋ ํ์ ๋น ์๋ฆฌ๋ 0์ผ๋ก ์ฒด์ด๋ค.
์ด๋ฅผ ์ผ์ชฝ์ผ๋ก 4๋ฒ ์๋ฆฌ์ด๋์ํค๋ฉด โช
sll $t2 , $s0, 4 #reg $t2 = reg $ << 4 bits
์ด ๋๋ค.
MIPS์์๋ ์ด ๋ช ๋ น์ด๋ค์ sll(shift left logical) srl(shift right logical)๋ก ๋ถ๋ฅธ๋ค. ์ด์ ์์ ๋ฏธ๋ค๋๋ โณ shamt โณ ์ด ๋ฑ์ฅํ๋ค. ์ด๋ ์๋ฆฌ ์ด๋๋(shift amount)์ ๋ํ๋ด๋ ๊ฒ์ผ๋ก ์์ ๋ช ๋ น์ด์์ shamt์ 4๊ฐ ๋๋ค.
๐ง ์์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ํ ๋ฒ ๋ณด๋ฉด, ๋จ์ํ ์ด๋์ด ์๋๋ผ๋ ๊ฒ์ ์ ์ ์๋ค. sll(โช)์ 2^i๋ฅผ ๊ณฑํ ๊ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋๋ค.
๋ ๋ค๋ฅธ ์ ์ฉํ ์ฐ์ฐ์ AND์ด๋ค. AND์ฐ์ฐ์ ๋นํธ ๋ ๋นํธ ์ฐ์ฐ์๋ก ๋ ๋นํธ ๊ฐ์ด ๋ชจ๋ 1์ผ ๊ฒฝ์ฐ์๋ง ๊ฒฐ๊ณผ๊ฐ 1์ด ๋๋ค. ์ด์ ๋ฐ๋๋ก, OR ์ฐ์ฐ์๋ 1์ด ํ๋๋ง ํฌํจ๋์ด ์๋๋ผ๋ 1์ด ๋๋ค. NOT ์ฐ์ฐ์ ํผ์ฐ์ฐ์์ ๋นํธ๊ฐ 0์ด๋ฉด 1, 1์ด๋ฉด 0์ผ๋ก ๋ง๋ ๋ค. MIPS์ ์ค๊ณ์๋ค์ ์์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ 3-ํผ์ฐ์ฐ์ ํ์์ ์ ์งํ๊ธฐ ์ํด์ NOR๋ช ๋ น์ด๋ฅผ ํฌํจ์์ผฐ๋ค. NOR0 = NOT(A OR 0) = NOT(A)๊ฐ ๋๋ ๊ฒ์ด๋ค.
์ปดํจํฐ๊ฐ ๋จ์ํ ๊ณ์ฐ๊ธฐ์ ๋ค๋ฅธ ์ ์ ํ๋จ๊ธฐ๋ฅ์ด ์๋ค๋ ์ ์ด๋ค. ์ ๋ ฅ ๋ฐ์ดํฐ๋ ์ฐ์ฐ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๋ค. ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ๋ณดํต 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๋ฅผ ์ฌ์ฉํ๋ค.
๐ฃํ๋ก์์ (procedure)๋ ํจ์๋ ์ดํดํ๊ธฐ ์ฝ๊ณ โป ์ฌ์ฌ์ฉ โป์ด ๊ฐ๋ฅํ๋๋ก ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์์ ์ดํด๋ณธ ์ถ์ํ(abstraction)๊ณผ ๊ด๋ จ์ด ์๋ค. ํ๋ก์์ ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ํ ๋ฒ์ ํ ๋ถ๋ถ์ฉ ์ง์คํด์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํด์ค๋ค.
๐ฃ์ธ์(parameter)๋์์ ์ ๊ฐ์ ๋ณด๋ด๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ์ผ์ ํ๋ฏ๋ก, ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ ๋ฐ ๋ฐ์ดํฐ์ ํ๋ก์์ ์ฌ์ด์ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ค.
ํ๋ก๊ทธ๋จ์ด ํ๋ก์์ ๋ฅผ ์คํํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฏ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค.
- ํ๋ก์์ ๊ฐ ์ ๊ทผํ ์ ์๋ ๊ณณ์ ์ธ์๋ฅผ ๋ฃ๋๋ค
- ํ๋ก์์ ๋ก ์ ์ด๋ฅผ ๋๊ธด๋ค.
- ํ๋ก์์ ๊ฐ ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ ์์์ ํ๋ํ๋ค.
- ํ์ํ ์์ ์ ์ํํ๋ค.
- ํธ์ถํ ํ๋ก๊ทธ๋จ์ด ์ ๊ทผํ ์ ์๋ ์ฅ์์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฃ๋๋ค.
- ํ๋ก์์ ๋ ํ๋ก๊ทธ๋จ ๋ด์ ์ฌ๋ฌ ๊ณณ์์ ํธ์ถ๋ ์ ์์ผ๋ฏ๋ก ์๋ ์์น๋ก ์ ์ด๋ฅผ ๋๋ ค์ค๋ค.
์์, ๊ณต๋ถํ๋ ๊ฒ์ฒ๋ผ ๋ ์ง์คํฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๊ณณ์ด๋ฏ๋ก ๊ฐ๋ฅํ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋์ MIPS๋ ๊ด๋ก์ ๋ฐ๋ผ ๋ ์ง์คํฐ 32๋ฅผ ํ ๋นํ๋ค.
์ดํ์๋ ํค์๋ ์ค์ฌ์ผ๋ก ํ๋ก์์ ๋ช ๋ น์ด์ ๋ํด์ ์์๋ณด์!
MIPS ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ ๋ ์ง์คํฐ๋ฅผ ํ ๋นํ ๋ฟ๋ง ์๋๋ผ ํ๋ก์์ ๋ฅผ ์ํ ๋ช ๋ น์ด๋ ์ ๊ณตํ๋ค. ๊ทธ ์๊ฐ ์ง์ ํ ์ฃผ์๋ก ์ ํํ๋ฉด์ ๋์์ ๋ค๋ฅธ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ra๋ ์ง์คํฐ์ ์ ์ฅํ๋ ๋ช ๋ น์ด๋ก jal ๋ช ๋ น์ด (jump - and - link instruction)๋ผ ๋ถ๋ฅธ๋ค.
์ด๋ฆ์์ link๋ ํ๋ก์์ ์ข ๋ฃ ํ ์ฌ๋ฐ๋ฅธ ์ฃผ์๋ก ๋๋์์ฌ ์ ์๋๋ก ํธ์ถํ ๊ณณ๊ณผ ํ๋ก์์ ์ฌ์ด์ ์ฃผ์ ๋๋ ๋งํฌ๋ฅผ ํ์ฑํ๋ค๋ ๋ป์ด๋ค. ๋ ์ง์คํฐ๊ฐ $ra(๋ ์ง์คํฐ31)์ ๊ธฐ์ต๋๋ ์ด ๋งํฌ๋ฅผ ๋ณต๊ท ์ฃผ์(return address)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํ ํ๋ก์์ ๊ฐ ์ฌ๋ฌ ๊ณณ์์ ํธ์ถ๋ ์ ์์ผ๋ฏ๋ก ๋ณต๊ท ์ฃผ์๋ ๊ผญ ํ์ํ๋ค.
์์ ์ดํด๋ณธ ๋งํฌ์ ๋ณต๊ท๋ฅผ ์ง์ํ๊ธฐ ์ํด์ 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๋ ํธ์ถ ์ ํ ๊ฐ์ ๊ฐ์ ์ ์งํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ์ฅ/์ ์ฌ ๋ช ๋ น์ ํ์ง ์์๋ ๋๋ค.
๐ฃ ๋ง๋จ(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)๊ฐ ํ๋ก์์ ํ๋ ์์ ์ฒซ ๋ฒ์งธ ์๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ค. ์คํ ํฌ์ธํฐ ๊ฐ์ด ํ๋ก์์ ๋ด์์ ๋ฐ๋ ์๋ ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ด ์ง์ญ ๋ณ์์ ๋ํ ๋ณ์๋ ๋ณ์๊ฐ ํ๋ก์์ ์ด๋ ๋ถ๋ถ์์ ์ฌ์ฉ๋๋๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค.
๐ต ๋ง์ฝ ํ๋ ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด, ํ๋ ์ ํฌ์ธํฐ๊ฐ ๋ณํ์ง ์๋ ๋ฒ ์ด์ค ๋ ์ง์คํฐ ์ญํ ์ ํ๋ฏ๋ก ์ง์ญ ๋ณ์ ์ฐธ์กฐ๊ฐ ๊ฐ๋จํด์ง๋ค. ๋ณ๋์ ํ๋ ์ ํฌ์ธํฐ ์ฌ์ฉ ์ฌ๋ถ์ ์๊ด์์ด ์กํฐ๋ฒ ์ด์ ๋ ์ฝ๋๋ ํญ์ ์คํ์ ์กด์ฌํจ์ ์ ์ํ๋. ๐ต
์ต์์ ์ฃผ์์์๋ถํฐ ์์ํด ์๋์ชฝ์ผ๋ก ์๋๋ค.
ํ(Heap)์ ์ฌ์ฉํ๋ค. ์คํ๊ณผ ํ์ด ์๋ก ๋ง์ฃผ ๋ณด๋ฉฐ ์๋ผ๋๋ก ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค. C๋ ํจ์๋ฅผ ์ฌ์ฉํด์ ํ์ ๊ณต๊ฐ์ ํ ๋น ๋ฐ๊ธฐ๋, ๋๋ ค์ฃผ๊ธฐ๋ ํ๋ค. (malloc(), free()) ๊ทผ๋ฐ ์ฌ์ฉํ๊ณ ๋ฐ๋ฉ์ ์์ด๋ฒ๋ฆฌ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ถ(memory leak)์ด ๋ฐ์ํด ์ด์์ฒด์ ๊ฐ ๋ถ๊ดด๋ ์ ์๋ค. ๋ฐ๋ฉด์ ๋๋ฌด ์ผ์ฐ ๋ฐ๋ฉํ๋ฉด '๋งค๋ฌ๋ฆฐ ํฌ์ธํฐ'(dangling pointer)๊ฐ ๋ฐ์ํ๋ค. Java์์ ๋ ์ด๋ฐ ๋ฒ๊ทธ๋ฅผ ํผํ๊ธฐ ์ํด ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ด์ฉํ๋ค.
์์์ ๊ธฐํ ์ ์ ๋ณ์๋ค์ด ์ฌ๊ธฐ์ ๋ค์ด๊ฐ๋ฉฐ ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋์ด ์๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค. ์ด๊ณณ์ ๋ค์ด๊ฐ๋ ๋ฐฐ์ด์ ๊ทธ ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋์ด ์์ด์ ์ ์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์ ๋ง๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(linked list) ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ ํฌ๊ธฐ๊ฐ ๊ฐ๋ณ์ ์ด๋ฏ๋ก ํ ์ธต ๋ ์์ธ dynamic data์ ๋ค์ด๊ฐ๋ค.
MIPS ๊ธฐ๊ณ์ด ์ฝ๋๊ฐ ๋ค์ด๊ฐ๋ ๋ถ๋ถ์ด๋ฉฐ ํ ์คํธ ์ธ๊ทธ๋จผํธ(text segment)๋ผ ๋ถ๋ฅธ๋ค.
์ตํ์ ์ฃผ์๋ถ๋ถ์ ์ฌ์ฉ์ด ์ ๋ณด๋์ด ์๋ค.
<์ฐธ๊ณ > 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 : a3 input arguments to a procedure
- Regs 8-15 : t7 temporaries #๊ตณ์ด ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ง๊ณ ๊ฐ ํ์๊ฐ ์๋ค.
- Regs 16-23: s7 variables
- Regs 24-25: t9 more temporaries
- Reg 28 : $gp global pointer
- Reg 29 : $sp stack pointer
- Reg 30 : $fp frame pointer
- Reg 31 : $ra return address
ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ์์๋ ๋์ฒด๋ก ํฌ๊ธฐ๊ฐ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋๋ถ๋ถ์ ์์ 16๋นํธ๋ฉด ์ถฉ๋ถํ๋ค. enough! ํ์ง๋ง ๋์ ๋ฐ๋ผ์๋ ๋ ํฐ ์์๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ด ๋๋ฅผ ์ํด MIPS๋ ๋ ์ง์คํฐ์ ์์ 16 ๋นํธ์ ์์๋ฅผ ๋ฃ๋ lui(load upper immediate)๋ช ๋ น์ด๋ฅผ ์ ๊ณตํ๋ค. ํ์ 16 ๋นํผ๋ ๊ทธ ๋ค์์ ๋์ค๋ ๋ค๋ฅธ ๋ช ๋ น์ผ๋ก ์ฑ์ธ ์ ์๋ค.
๋ ์ง์คํฐ $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 s1, Exit #go to Exit if $s0 !== s1
์กฐ๊ฑด๋ถ ๋ถ๊ธฐ ๋ช ๋ น์๋ ๋ถ๊ธฐ ์ฃผ์ ์ธ์ ๋ ๊ฐ์ ํผ์ฐ์ฐ์๊ฐ ๋ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก J๋ฅผ ์ฐ์ง ๋ชปํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ด์ ๋ธ ๋์ด 16 ๋นํธ๋ง ์ธ ์ ์๋ค.
๋ง์ผ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฃผ์๊ฐ ์ด 16๋นํธ ํ๋์ ๋ค์ด๊ฐ์ผ ํ๋ค๋ฉด, ์ด๋ค ํ๋ก๊ทธ๋จ๋ 2^16๋ณด๋ค ๋ ์ปค์ง ์ ์๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋๋ฌด ์๋ค. ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น? ๋์์ ์ด๋ค ๋ ์ง์คํฐ๋ฅผ ์ง์ ํด์ ๊ทธ ๊ฐ์ ๋ถ๊ธฐ ์ฃผ์์ ๋ํ๋๋ก ํ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํ์ ๋ ๋ถ๊ธฐ ์ฃผ์๋ PC = ๋ ์ง์คํฐ + ๋ถ๊ธฐ์ฃผ์๊ฐ ๋๋ค.
์ด ๋ฐฉ์์ ํ๋ก๊ทธ๋จ ํฌ๊ธฐ๊ฐ 2^32๊น์ง ์ปค์ง๋ ๊ฒ์ ํ์ฉํ๋ฉด์ ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ๋ ์ง์ํ๋ฉฐ ๋ถ๊ธฐ ์ฃผ์์ ํฌ๊ธฐ ์ ํ์ ๊ทน๋ณตํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด์ ๋จ์ ๋ฌธ์ ๋ ์ด๋ค ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋๊ฐ์ด๋ค.
์กฐ๊ฑด๋ถ ๋ถ๊ธฐ๋ฅผ ์์ธํ ๋ณด๋ฉด ๋๋ถ๋ถ์ด 16๊ฐ ๋ช ๋ น์ด ์ด์ ๋จ์ด์ง์ง ์์ ์์น๋ก ๋ถ๊ธฐํ๋ค. PC๋ ํ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ๋ถ๊ธฐ ์ฃผ์๋ฅผ ๋ํ ๋ ์ง์คํฐ๋ก PC๋ฅผ ์ ํํ๋ฉด ํ ์์น์์ +-2^15์๋ ์ด๋ด ๋จ์ด์ง ๊ณณ์ ์ด๋๋ก๋ ์ง ๋ถ๊ธฐํ ์ ์๋ค. ์ต๊ทผ์ ๋ชจ๋ ์ปดํจํฐ๊ฐ ๊ทธ๋ ๋ฏ MIPS๋ ๋ชจ๋ ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ ๋ช ๋ น์ PC ์๋ ์ฃผ์๋ฅผ ์ฌ์ฉํ๋ค. ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ์ ๋ชฉ์ ์ง๋ ๋๋ถ๋ถ ๊ฐ๊น์ด ๊ณณ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ดํ์ ์ดํด๋ณด๊ฒ ์ง๋ง ํ๋์จ์ด ์ ์ฅ์์๋ PC๋ฅผ ์ผ์ง ์ฆ๊ฐ์์ผ ๋ค์ ๋ช ๋ น์ด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๋ ๊ฒ์ด ํธํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ค์ MIPS ์ฃผ์๋ ํ์ฌ ๋ช ๋ น์ด ์ฃผ์PC๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ๊ฒ์ด ์๋๋ผ ๋ค์ ๋ช ๋ น์ด ์ฃผ์ PC + 4๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค.
๋ฐ๋ฉด์, ํ๋ก์์ ๋ค์ ๊ฐ๊น์ด ๋ถ์ด ์์ด์ผํ ์ด์ ๊ฐ ์๋ค. JAL ๋ช ๋ น์ ๊ทธ๋์ ๋ค๋ฅธ ์ฃผ์ ์ง์ ๋ฐฉ์์ ์ด์ฉํ๋ค. MIPS์์ j๋ช ๋ น์ด๋ jal๋ช ๋ น์ด๊ฐ ๊ธด ์ฃผ์๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก Jํ์ ํ์์ ์ฌ์ฉํ๋ค.
์ฌ๋ฌ ํํ์ ์ฃผ์ ํํ์ ์ผ๋ฐ์ ์ผ๋ก ์ฃผ์ ์ง์ ๋ฐฉ์(addressing mode)๋ผ๊ณ ํ๋ค.
ํผ์ฐ์ฐ์๋ ๋ช
๋ น์ด ๋ด์ ์๋ ์์์ด๋ค.
ํผ์ฐ์ฐ์๋ ๋ ์ง์คํฐ
๋ฉ๋ชจ๋ฆฌ ๋ด์ฉ์ด ํผ์ฐ์ฐ์์ด๋ค. ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๋ ์ง์คํฐ์ ๋ช
๋ น์ด ๋ด์ ์์๋ฅผ ๋ํด์ ๊ตฌํ๋ค.
pc ๊ฐ๊ณผ ๋ช ๋ น์ด ๋ด ์์์ ํฉ์ ๋ํด์ ์ฃผ์๋ฅผ ๊ตฌํ๋ค.
๋ช
๋ น์ด ๋ด์ 26๋นํธ๋ฅผ PC์ ์์ ๋นํธ๋ค๊ณผ ์ฐ์ ํ์ฌ ์ ํ ์ฃผ์๋ฅผ ๊ตฌํ๋ค.