Table of Contents
์ง๋ ํ๊ธฐ ์ด์์ฒด์ ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ๋ ๋ฎ์ ๋ ๋ฒจ์ ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ถ๊ธํด์ก๋ค. David A. Patterson๊ณผ John L. Hennessy์ Computer Organization and Design 5th Edition์ ์ ๋ฐ๋ถ๋ฅผ ๋ฐํ์ผ๋ก MIPS instruction set์ ๋ํด ์ ๋ฆฌํ๋ค.
Computer Abstractions and Technology
์ปดํจํฐ ์ํคํ ์ฒ๋ฅผ ๊ณต๋ถํ๋ค๋ ๊ฒ์ ์ปดํจํฐ๋ฅผ ๊ตฌ์ฑํ๋ ํ๋์จ์ด์ ๋ช ๋ น์ด๊ฐ ์ด๋ป๊ฒ ํจ๊ป ๋์ํ๋์ง ์์๋ณด๋ ๊ฒ์ด๋ค. ํ๋์จ์ด๋ฅผ ๋ค๋ฃจ๊ธฐ๋ ํ์ง๋ง ํ๋ก์ ๋ํ ๋ถ๋ถ์ ์์ธํ ๋ค๋ฃจ์ง๋ ์๋๋ค. ํ๋ก๋ ๋ก์ฐ๋ ๋ฒจ ์ํคํ ์ฒ์ด๊ณ , ์์ผ๋ก ๋ค๋ฃฐ ๋ด์ฉ์ ํ๋ก(ํ๋์จ์ด)์ ์ด์์ฒด์ (์ํํธ์จ์ด) ์ฌ์ด์ ์๋ ISA(Instruction Set Architecture), microarchitecture์ ๊ฐ์ ํ์ด๋ ๋ฒจ ์ํคํ ์ฒ๋ค.
Instructions: Language of the Computer
ISA๋ add
, load
์ ๊ฐ์ ๋ช
๋ น์ ์งํฉ์ผ๋ก, ํ๋์จ์ด์ ์ํํธ์จ์ด ์ฌ์ด์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ค. microarchitecture๋ ISA์ ๊ตฌํ์ฒด๋ก, ํ๋ก์ธ์์ ์
์ถ๋ ฅ subsystem์ ์กฐ์ง์ด๋ค. ํ์ดํ๋ผ์ธ์ ๊น์ด๋ ์บ์ ์ฌ์ด์ฆ๊ฐ microarchitecture๋ผ๊ณ ํ ์ ์๋ค.
๋จธ์ ์ค๊ณ์๋ ๋ ๊ฐ์ง ์ค์ํ ์์น์ด ์๋ค. ์ฒซ์งธ๋ ์ปดํจํฐ๋ ๋ชจ๋ ๊ฒ์ bit๋ก ์ดํดํ๊ธฐ ๋๋ฌธ์ instruction๊ณผ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํ์ง ๋ชปํ๋ค๋ ๊ฒ์ด๊ณ , ๋์งธ๋ ํ๋ก๊ทธ๋จ๋ ๋ฐ์ดํฐ์ ๋๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ค๋ ๊ฒ์ด๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๊ตฌํ์ผ๋ก ๊ตฌ๋ถํ ๊ฒ์ ์ธ๊ฐ์ ์ ์ฅ์ด์ง, ์ปดํจํฐ๋ ๊ฒฐ๊ตญ ๋ฐ์ด๋๋ฆฌ๋ก ๋ฐ์๋ค์ธ๋ค.
From a High-Level Language to the Language of Hardware
int main(int argc, char *argv[]) {
int s0 = 0, s1 = 1, s2 = 2;
s0 = s1 + s2;
return 0;
}
ํ์ด๋ ๋ฒจ ์ธ์ด๋ ์์ฐ์ด์ ๊ฐ์ฅ ๊ฐ๊น์ด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค. ๋์ ์์ฐ์ฑ์ ์ ๊ณตํ๋ฉฐ, C, C++, Java ๋ฑ ํํ ์ฌ์ฉ๋๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค์ ๋๋ถ๋ถ ํ์ด๋ ๋ฒจ ์ธ์ด๋ค. ํ์ด๋ ๋ฒจ ์ธ์ด๋ ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ณํ๋๋ค.
.data
.text
main:
add $s0, $s1, $s2
์ด์ ๋ธ๋ฆฌ์ด๋ ์ปดํจํฐ์ ๊ตฌ์ฒด์ ์ธ ๋์์ ํ ์คํธ๋ก ํํํ ๊ฒ์ผ๋ก, instruction์ ์งํฉ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ด ๋จ๊ณ์์ ํ์ด๋ ๋ฒจ ์ฝ๋๋ ๋ช ๋ น์ค ์ฌ์ด์ ์ ํ ์์ค๊น์ง ๋ด๋ ค๊ฐ๋ค. ์ด์ ๋ธ๋ฆฌ์ด๋ ์ด์ ๋ธ๋ฌ์ ์ํด ๊ธฐ๊ณ์ด๋ก ๋ณํ๋๋ค.
00000000000000000000000000000100
00000000000000000000000000000000
00000010001100101000000000100000
๊ธฐ๊ณ์ด๋ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ๋ฐ์ด๋๋ฆฌ ์ซ์๋ง์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ์ปดํจํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ฅผ CPU๋ก ๊ฐ์ ธ์ instruction์ ์ํํ๋ค.
Operations of the Computer Hardware
์ฌ๋ฌ ์ข ๋ฅ์ ISA๊ฐ ์๋ค. ๋ํ์ ์ผ๋ก Intel๊ณผ AMD์์ ๋ง๋ x86, AMD64๊ฐ ์๋๋ฐ, ์ด๋ค์ CPU ์ํคํ ์ฒ๋ CISC(Complex Instruction Set Computer) ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๊ต์ฅํ ๋ณต์กํ๋ค. ํํธ RISC(Reduced Instruction Set Computer) ๊ตฌ์กฐ๋ ๋ณด๋ค ๊ฐ์ํ๋ค. RISC ๊ตฌ์กฐ์ธ ARM ์ํคํ ์ฒ๋ ์ค๋งํธํฐ์ด๋ ํ๋ธ๋ฆฟ๊ณผ ๊ฐ์ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ, 2020๋ ์ ์ถ์๋ M1 ๋งฅ๋ถ๋ ARM์ ๊ธฐ๋ฐ์ผ๋กํ CPU๋ฅผ ์ฌ์ฉํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ MIPS(Microprocessor without Interlocked Pipeline Stages)๋ RISC ๊ตฌ์กฐ ์ํคํ ์ฒ๋ค. MIPS๋ ๋ช ๋ น์ด ์ธํธ๊ฐ ๊น๋ํด ์ปดํจํฐ ์ํคํ ์ฒ๋ฅผ ๊ณต๋ถํ๋ ๋ชฉ์ ์ผ๋ก ์ ํฉํ๋ฉฐ, ์ค์ ๋ก๋ ๋ธ๋ฃจ๋ ์ด ๊ธฐ๊ธฐ๋ ํ๋ ์ด์คํ ์ด์ ๊ณผ ๊ฐ์ ๋์งํธ ํ, ๋คํธ์ํน ์ฅ๋น์ ์ฌ์ฉ๋์๋ค.
MIPS Instructions
์์ ํ์ด๋ ๋ฒจ ์ธ์ด๊ฐ ์ด์ ๋ธ๋ฆฌ์ด๋ก, ์ด์ ๋ธ๋ฆฌ์ด๊ฐ ์ต์ข ์ ์ผ๋ก ๊ธฐ๊ณ์ด๋ก ๋ณํ๋๋ค๋ ๊ฒ์ ๋ณด์๋ค. ํ์ด๋ ๋ฒจ ์ธ์ด๋ ์๊ณ ์๋ค๋ ๊ฐ์ ํ์, ์ค์ MIPS์์ instruction์ด ์ด๋ป๊ฒ ์์ฑ๋๋์ง, ๊ทธ instruction์ด ์ด๋ค ๊ท์น์ ๋ฐ๋ผ ๊ธฐ๊ณ์ด๋ก ๋ณํ๋๋ ์ง ์์๋ณด์.
๋จผ์ CPU๊ฐ ๋งค๋ฒ ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ์ฝ์ด์ค๋ ๊ฒ์ ์ค๋ฒํค๋๊ฐ ํฐ ์ผ์ด๊ธฐ ๋๋ฌธ์ CPU๋ ๋ ์ง์คํฐ๋ผ๋ ์๊ณ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํฌ๊ธฐ๋ ์์ง๋ง ์๋๊ฐ ๋นจ๋ผ์ ๋ ์ง์คํฐ์ ๋ฐ์ดํฐ๋ฅผ ๋๋ฉด instruction์ ๋น ๋ฅด๊ฒ ์ํํ ์ ์๋ค. MIPS์ ์ฐ์ฐ์ 32x32bit ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ, 32bit ๋ฐ์ดํฐ๋ฅผ word๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ ์ง์คํฐ์ ์ผ๋ถ์๋ ๋ฏธ๋ฆฌ ์ด๋ฆ์ ๋ถ์ฌ ๋์๋๋ฐ, $t0
๋ถํฐ $t9
๊น์ง๋ ์์ ๋ ์ง์คํฐ(temporary register)๋ฅผ ์๋ฏธํ๋ฉฐ, $s0
๋ถํฐ $s7
๊น์ง๋ ๊ณ์ ์ฌ์ฉ๋๋ ๋ ์ง์คํฐ(saved register)๋ฅผ ์๋ฏธํ๋ค.
Arithmetic Operations
์ฐ์ ์ฐ์ฐ์ ๊ทธ๋ฆฌ ๋ณต์กํ์ง ์๋ค.
a = (b + c) - (d + e);
a
, b
, c
, d
, e
๊ฐ ๊ฐ๊ฐ ๋ ์ง์คํฐ $s0
, $s1
, $s2
, $s3
, $s4
์ ๋์๋๋ค๊ณ ํ๋ฉด MIPS ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค:
add $t0, $s1, $s2 # $t0 = $s1 + $s2
add $t1, $s3, $s4 # $t1 = $s3 + $s3
sub $s0, $t0, $t1 # $s0 = $t0 - $t1
add
๋ ๊ฐ์ ๋ง์
์, sub
๋ ๋บ์
์ ์ํํ๋ค.
Memory Operations
MIPS์ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ง์คํฐ๋ก, ๋ ์ง์คํฐ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธฐ๋ ์ผ์ ํ๋ค.
a = b + A[8]
a
, b
์ ๊ฐ๊ฐ $s1
, $s2
์ ๋์๋๊ณ , A
์ base address๊ฐ $s3
์ ๋์๋๋ค๊ณ ํ๋ฉด MIPS ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค:
lw $t0, 32($s3) # $t0 = $s3[8]
add $s1, $s2, $t0 # $s1 = $s2 + $t0
lw
๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ง์คํฐ๋ก ๊ฐ์ ๊ฐ์ ธ์จ๋ค. ์ ์ ๋ฐฐ์ด์ ์์๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ 1word(4bytes)์ฉ ์ฐจ์งํ๋ฉฐ ์ ์ฅ๋๋ค. ์ฆ, A[8]
๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ค์๊ณผ ๊ฐ์ด ์กด์ฌํ๋ค.
4byte 4byte 4byte 4byte
A[0], A[1], A[2], ..., A[8]
$s3, 4($s3), 8($s3), ..., 32($s3)
๋ฐ๋ผ 32($s3)
์ base address $s3
์์ 32bytes ๋จ์ด์ง ์์น์ ์ ๊ทผํ๋ค๋ ์๋ฏธ๊ฐ ๋๋ค. ์ด๋ ์์ ๋ถ๋ ์ซ์๋ฅผ offset์ด๋ผ๊ณ ํ๋ฉฐ, base address๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ์ง์คํฐ(์ ๊ฒฝ์ฐ $s3
)๋ base register๋ผ๊ณ ํ๋ค.
A[12] = a + A[8]
a
๊ฐ $s2
, A์ base address๊ฐ $s3
์ ๋์๋๋ค๊ณ ํ๋ฉด MIPS ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค:
lw $t0, 32($s3) # $t0 = $s3[8]
add $t0, $s2, $t0 # $t0 = $s2 + $t0
sw $t0, 48($s3) # A[12] = $t0
sw
๋ ๋ ์ง์คํฐ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธด๋ค. ์์์๋ lw
๋ก ๋ฉ๋ชจ๋ฆฌ์์ 32($s3)
๊ฐ์ ๊ฐ์ ธ์ ๋ ์ง์คํฐ์ $t0
์ ์ ์ฅํ๊ณ , ์๋์์๋ $t0
์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ 48($s3)
์์น์ ์ ์ฅํ๋ค.
Immediate Instructions
์์๋ฅผ ๋ํ ๋๋ addi
๋ฅผ ์ฌ์ฉํ๋ค.
addi $s3, $s3, 4 # $s3 = $s3 + 4
addi $s2, $s2, -1 # $s2 = $s2 + (-1)
์์์ ๋ํ ๋บ์ ์ฐ์ฐ์ ๋ฐ๋ก ์๊ธฐ ๋๋ฌธ์ ์์๋ฅผ ๋ํด์ฃผ๋ฉด ๋๋ค.
Constant
MIPS ๋ ์ง์คํฐ $zero
๋ ์์ 0์ ์๋ฏธํ๋ค.
add $t0, $s1, $zero # $t0 = $s1 + 0
์ ์ฒ๋ผ ๋ค๋ฅธ ๋ ์ง์คํฐ๋ก ๊ฐ์ ๊ทธ๋๋ก ๋์ ํ ๋ ์ฌ์ฉํ ์ ์๋ค.
Conditional Statement
if (i == j) {
a = b + c;
} else {
a = b - c;
}
a
, b
, c
, i
, j
๊ฐ ๊ฐ๊ฐ $s0
๋ถํฐ $s4
์ ๋์๋๋ค๊ณ ํ๋ฉด MIPS ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค:
bne $s3, $s4, Else # if ($s3 == $s4)
add $s0, $s1, $s2 # { $s0 = $s1 + $s2 }
j Exit
Else:
sub $s0, $s1, $s2 # else { $s0 = $s1 - $s2 }
Exit:
...
bne
๋ ๋ ๋ ์ง์คํฐ ๊ฐ์ด ๊ฐ์์ง ๋น๊ตํด ๊ฐ๋ค๋ฉด ๋ค์ ๊ตฌ๋ฌธ์, ๋ค๋ฅด๋ค๋ฉด ์ง์ ๋ ๋ผ๋ฒจ๋ก ์ ํํ๋ค. ์์์๋ bne
๋ฅผ ํตํด $s3
์ $s4
๊ฐ ๊ฐ์์ง ๋น๊ตํ ๋ค, ๋ค๋ฅด๋ค๋ฉด Else
๋ผ๋ฒจ๋ก ์ ํํด sub $s0, $s1, $s2
๋ฅผ ์คํํ๋๋ก ํ๋ค. ๋ผ๋ฒจ ์ด๋ฆ์ ๊ฐ๋ฐ์๊ฐ ์์๋ก ์ ํ ์ ์๋ค. ๊ผญ Else
๋ Exit
๋ผ๋ ์ด๋ฆ์ผ ํ์๋ ์๋ค๋ ๊ฒ์ด๋ค. ๋ํ ๋ผ๋ฒจ์ ์์น๋ ์ด์
๋ธ๋ฌ๊ฐ ๊ณ์ฐํ๋ค.
Loop
while (save[i] == k) {
i += 1;
}
i
, k
๊ฐ ๊ฐ๊ฐ $s3
, $s5
์, save
์ base address๊ฐ $s6
์ ๋์๋๋ค๊ณ ํ๋ฉด MIPS ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค:
Loop:
sll $t1, $s3, 2 # $t1 = $s3 << 2
add $t1, $t1, $s6 # $t1 = $t1($s6)
lw $t0, 0($t1) # $t0 = 0($t1)
bne $t0, $s5, Exit # if ($t0 != $s5) { goto Exit }
addi $s3, $s3, 1 # $s3 += 1
j Loop
Exit:
...
์๋นํ ๋ณต์กํ๋ฐ, ํฌ๊ฒ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์๋ค. bne
๋ถํฐ j
๋ผ์ธ๊น์ง๋ ๋ฃจํ์ ์กฐ๊ฑด์ ํ์ธํ๊ณ i
๊ฐ์ ์ฆ๊ฐ์ํค๋ ๋ถ๋ถ์ด๋ค. ๊ทธ ์์ sll
๋ถํฐ lw
๋ผ์ธ๊น์ง๋ ๋ ์ง์คํฐ์ save[i]
๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ถ๋ถ์ด๋ค.
sll
์์ฒด๋ control flow์ ์ค์ํ instruction์ด ์๋๊ณ , ๋จ์ํ ๊ฐ์ left shiftํ๋ ๊ธฐ๋ฅ์ ํ๋ค. $s3
์ ๊ฐ์ 2๋งํผ left shiftํ๋ฉด 4๋ฅผ ๊ณฑํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์ด๋ $s3
๊ฐ์ด 1์ฆ๊ฐํ ๋๋ง๋ค 4๋ฅผ ๊ณฑํจ์ผ๋ก์จ $s6
์ ์ ๊ทผํ๋ ์ฃผ์๊ฐ์ 4bytes์ฉ ์ฎ๊ธฐ๊ธฐ ์ํ ์ฝ๋๋ค. right shift๋ฅผ ํ๊ธฐ ์ํด์๋ srl
์ ์ฌ์ฉํ๋ค.
MIPS Procedure
procedure๋ ํจ์๋ฅผ ์๋ฏธํ๋ค. ์ด์ ๋ธ๋ฆฌ ๋ ๋ฒจ์์ ํจ์๋ฅผ ๋ง๋ค๊ณ ํธ์ถํ๋ ๊ฒ์ ํ์ด๋ ๋ฒจ ์ธ์ด์์ ํ๋ ๊ฒ๊ณผ๋ ๋ง์ด ๋ค๋ฅด๋ค. ์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ ์ง์คํฐ์ ๋ฐฑ์ ๊ณผ ์ ํ๋ค.
Leaf Procedure
ํธ์ถ๋ ํจ์์์ ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ์ง ์๋ ํจ์, ์ฆ leaf procedure๋ฅผ ๊ฐ์ ํด๋ณด์:
int leaf_procedure(int a, b, c, d) {
int e;
e = (a + b) - (c -d);
return e;
}
a
๋ถํฐ d
๊น์ง๊ฐ $a0
๋ถํฐ $a3
์ ๋์๋๊ณ , e
๋ $s0
์ ๋์๋๋ค๊ณ ํ๋ฉด MIPS ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค:
main:
jal leaf_procedure # leaf_procedure ํธ์ถ
j exit
leaf_procedure:
addi $sp, $sp, -12 # 4bytes ๋ ์ง์คํฐ 3๊ฐ ๋ฐฑ์
์ ์ํด stack pointer ์์น -12 ์ด๋
sw $t1, 8($sp) # 8($sp) = $t1
sw $t0, 4($sp) # 4($sp) = $t0
sw $s0, 0($sp) # 0($sp) = $s0
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
add $v0, $s0, $zero
lw $s0, 0($sp) # $s0 = 0($sp)
lw $t0, 4($sp) # $t0 = 4($sp)
lw $t1, 8($sp) # $t1 = 8($sp)
addi $sp, $sp, 12 # stack pointer ์์น ๋ณต์
jr $ra # $ra ์์น๋ก ์ ํ
exit:
...
โฆ์ ์ด๋ฐ ์ง์ ํ๋๊ฑธ๊น? ํ๋์ฉ ์ดํด๋ณด์.
main:
jal leaf_procedure # leaf_procedure ํธ์ถ
j exit
๋จผ์ jal
์ ํตํด leaf_procedure
๋ผ๋ฒจ๋ก ์ด๋ํ๋ค. ์ด๋, ๋ ์ง์คํฐ์ $ra
(return address)๋ program counter์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค. program counter๋ ํ๋ก์ธ์ค๊ฐ ์์ ์ instruction์ ์ด๋๊น์ง ์คํํ๋์ง ์ฒดํฌํ๊ธฐ ์ํ ๊ฐ์ด๋ค. ์ด ๊ฒฝ์ฐ $ra
๋ jal leaf_procedure
๋ฐ๋ก ๋ค์ ๋ผ์ธ j exit
๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
leaf_procedure:
addi $sp, $sp, -12 # 4bytes ๋ ์ง์คํฐ 3๊ฐ ๋ฐฑ์
์ ์ํด stack pointer ์์น -12 ์ด๋
leaf_proceduer
์์๋ ๋จผ์ ๋ ์ง์คํฐ์ $sp
(stack pointer)์ 4bytes ๋ ์ง์คํฐ 3๊ฐ๋ฅผ ๋ฐฑ์
ํ๊ธฐ ์ํด $sp
์ -12
๋ฅผ ๋ํ๋ค. $sp
๋ ๋ฉ๋ชจ๋ฆฌ์ ์คํ์ ํน์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ์ง์คํฐ์ด๋ฉฐ, ์ด ์์น๋ฅผ ์ฎ๊ธฐ๋ ๊ฒ์ ๋ฐฑ์
์ ์ํ ๊ณต๊ฐ์ ํ๋ณดํ๋ ๊ฒ์ด๋ค.
sw $t1, 8($sp) # 8($sp) = $t1
sw $t0, 4($sp) # 4($sp) = $t0
sw $s0, 0($sp) # 0($sp) = $s0
๊ทธ๋ฆฌ๊ณ sw
๋ฅผ ํตํด $t1
, $t0
, $s0
๋ฅผ $sp
์ ๊ฐ ๊ณต๊ฐ์ ๋ด์๋ค. (ํฐ ๊ฐ๋ถํฐ ์ ๊ทผํ๋ ์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์คํ ์ฃผ์๊ฐ ํฐ ์ชฝ์์ ์์ ์ชฝ์ผ๋ก ํฅํ๊ธฐ ๋๋ฌธ์ด๋ค.) ์ด๋ ๊ฒ ํ๋ ์ด์ ๋ leaf_procedure
๋ฅผ ํธ์ถํ caller์ธก(์ด ๊ฒฝ์ฐ main
)์์ $t1
์ด๋ $t0
, $s0
๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ฝ ์คํ์ ๋ฐฑ์
ํ์ง ์๋๋ค๋ฉด caller์์ ์ฌ์ฉํ๋ ๊ฐ์ ๋ฎ์ด์์ ๋ฒ๋ฆด ๊ฒ์ด๋ค.
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
add $v0, $s0, $zero
e = (a + b) - (c -d)
์ ํด๋นํ๋ ์ฐ์ฐ์ ์ํํ๋ค.
lw $s0, 0($sp) # $s0 = 0($sp)
lw $t0, 4($sp) # $t0 = 4($sp)
lw $t1, 8($sp) # $t1 = 8($sp)
lw
๋ฅผ ํตํด $sp
์ ์ ์ฅํ ๊ฐ์ ๋ค์ ๋ถ๋ฌ์๋ค. stack pointer๋ ๋ค์ 12bytes ๋น๊ฒผ๋ค.
jr $ra # $ra ์์น๋ก ์ ํ
jr
์ ํตํด caller์ ์์นํ $ra
๋ก ๋์๊ฐ j exit
๋ฅผ ์คํํ๋ค.
์ฌ๊ธฐ์๋ $t1
๊ณผ $t0
๋ ๋ฐฑ์
์ ํ๋๋ฐ, ์ฌ์ค ์ด๋ด ํ์๋ ์๋ค. $t
๋ ์ง์คํฐ๋ temporary register์ด๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ ์์ ๊ฐ๋ง ์ ์ฅํ๋๋ก ์ฝ์๋์ด์๋ค. ๋ฐ๋ผ์ $t
๋ ์ง์คํฐ์๋ ๊ฐ์ด ๋ฎ์ด์์์ ธ๋ ๋ฌธ์ ๊ฐ ์๋๋ก ์ฝ๋๋ฅผ ์ง์ผํ๋ค.
Non-Leaf Procedure
ํจ์ ์์์ ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ๋ non-leaf procedure๋ ์ด๋จ๊น? ์ด๋ ๊ฒ ํธ์ถ์ด ์ค์ฒฉ๋ ๊ฒฝ์ฐ์๋ $ra
์ ์ ์ฅ๋ callr์ ์์น๊ฐ ๋ฎ์ด ์์์ ธ ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์ํ์ด ์๋ค. ์ผ๋จ ํ์ด๋ ๋ฒจ ์ฝ๋๋ฅผ ๋ณด์:
int factorial(int n) {
if (n < 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
recursiveํ๊ฒ ๋์ํ๋ ํฉํ ๋ฆฌ์ผ ํจ์๋ค. n
์ด $a0
์, ๊ฒฐ๊ณผ๊ฐ์ด $v0
์ ๋์๋๋ค๊ณ ๊ฐ์ ํ๋ฉด MIPS ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค:
factorial:
addi $sp, $sp, -8 # stack pointer ์์น -8 ์ด๋
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 1 # $t0 = ($a0 < 1)
beq $t0, $zero, L1 # if ($t0 == 0) { goto L1 }
addi $v0, $zero, 1
addi $sp, $sp, 8 # stack pointer ์์น 8 ์ด๋
jr $ra
L1:
addi $a0, $a0, -1 # $a -= 1
jal factorial # factorial($a0)
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8 # stack pointer ์์น 8 ์ด๋
mul $v0, $a0, $v0 # $v0 = $a0 * $v0
jr $ra
๊ต์ฅํ ๋ณต์กํด๋ณด์ด์ง๋ง, ํ๋์ฉ ๋ฏ์ด๋ณด๋ฉดโฆ ์ง์ง ๋ณต์กํ๋ค. ์๋ ๋ฐฉ์์ ๋๋ต ์ฌ๊ท์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๋ฉด์ stack pointer๋ฅผ ๋ฐ์ด๋ด๋ฉฐ ๊ฐ์ ๋ฐฑ์
ํ๋ค๊ฐ, ์ดํ ๋ค์ stack pointer๋ฅผ ๋น๊ธฐ๋ฉฐ ๊ฐ์ ๊ฐ์ ธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ์์ด๋ค. $a0
๊ฐ 3์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ๋ชจ๋ instruction ๋จ๊ณ๋ฅผ step by step์ผ๋ก ํ ๋จ๊ณ ํ ๋จ๊ณ ์ดํด๋ณด์.
factorial:
addi $sp, $sp, -8 # stack pointer ์์น -8 ์ด๋
sw $ra, 4($sp)
sw $a0, 0($sp)
๋จผ์ factorial
ํจ์์ ์ง์
ํด stack pointer๋ฅผ ์ด๋์ํค๊ณ $ra
์ $a0
๋ ์ง์คํฐ๋ฅผ ๋ฐฑ์
ํ๋ค. ์ด๋ $ra
๋ factorial
ํจ์๋ฅผ ํธ์ถํ ์์น๊ฐ ๋ ๊ฒ์ด๊ณ , $a0
๋ ์์ ๊ฐ์ ํ 3์ด ๋๋ค. ์คํ์ ๋ชจ์ต์ ๋ค์๊ณผ ๊ฐ๋ค:
+--------+------------+
| $a = 3 | caller $ra |
+--------+------------+
์ด์ ๋ค์ ๋ผ์ธ์ ๋ณด์:
slti $t0, $a0, 1 # $t0 = ($a0 < 1)
beq $t0, $zero, L1 # if ($t0 == 0) { goto L1 }
$a0
๊ฐ 1๋ณด๋ค ์์์ง ํ์ธํ๊ณ , ๊ทธ ๋ฐํ ๊ฐ์ $t0
์ ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ $t0
๊ฐ $zero
์ ๊ฐ์์ง ํ์ธํด ๊ฐ์ด ๊ฐ๋ค๋ฉด L1
๋ผ๋ฒจ๋ก ์ด๋ํ๋ค. ์ด๋ $a0
๋ 3์ด๊ธฐ ๋๋ฌธ์ 1๋ณด๋ค ์์ง ์๋ค. ๋ฐ๋ผ์ $t0
๋ 0์ด ๋๊ณ , beq
๋ฅผ ๋ง์กฑํด L1
์ผ๋ก ๋์ด๊ฐ๋ค.
L1:
addi $a0, $a0, -1 # $a -= 1
jal factorial # factorial($a0)
L1
์ ํ์ด๋ ๋ฒจ ์ฝ๋์์ return n * factorial(n - 1);
์ ํด๋นํ๋ ๋์์ ์ ์ํ๋ค. ๋จผ์ $a0
์์ 1์ ๋บ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ factorial
ํจ์๋ฅผ ํธ์ถํ๋ค.
factorial:
addi $sp, $sp, -8 # stack pointer ์์น -8 ์ด๋
sw $ra, 4($sp)
sw $a0, 0($sp)
factorial
์ $sp
๋ฅผ ๋ค์ -8 ์ด๋ํ๋ค. ๊ทธ๋ฆฌ๊ณ $ra
์ $a0
๋ฅผ ๋ฐฑ์
ํ๋ค. ์ด๋ $ra
๋ ์์ ์คํํ L1
์ jal factorial
์ ๋ฐ๋ก ๋ค์ ๋ผ์ธ์ด๊ณ , $a0
๋ 2๊ฐ ๋๋ค. ํ์ฌ ์คํ์ ์ ์ฅ๋ ๋ ์ง์คํฐ ๊ฐ์ ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค:
+--------+------------+--------+--------+
| $a = 3 | caller $ra | $a = 2 | L1 $ra |
+--------+------------+--------+--------+
์ด์ด์ ๋ค์ ๋ผ์ธ์ ์ดํด๋ณด์:
slti $t0, $a0, 1 # $t0 = ($a0 < 1)
beq $t0, $zero, L1 # if ($t0 == 0) { goto L1 }
$a0
๊ฐ 2์ด๋ฏ๋ก 1๋ณด๋ค ์์ง ์๋ค. $t0
๊ฐ 0์ด ๋๊ณ , beq
๋ฅผ ๋ง์กฑํด ๋ค์ L1
์ผ๋ก ๋์ด๊ฐ๋ค.
L1:
addi $a0, $a0, -1 # $a -= 1
jal factorial # factorial($a0)
L1
์ ์๊น์ ๋ง์ฐฌ๊ฐ์ง๋ก $a
์์ 1์ ๋นผ 1๋ก ๋ง๋ค๊ณ , ๋ค์ factorial
๋ก ๋์ด๊ฐ๋ค.
factorial:
addi $sp, $sp, -8 # stack pointer ์์น -8 ์ด๋
sw $ra, 4($sp)
sw $a0, 0($sp)
factorial
์์๋ $sp
๋ฅผ ๋ค์ -8 ์ด๋ํ๋ค. ์ด๋ ๋ฐฑ์
๋๋ $ra
๋ ์์ ์คํํ L1
์ jal factorial
์ ๋ฐ๋ก ๋ค์ ๋ผ์ธ์ด๊ณ , $a0
๋ 1์ด๋ค. ํ์ฌ ์คํ์ ์ ์ฅ๋ ๋ ์ง์คํฐ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค:
+--------+------------+--------+--------+--------+--------+
| $a = 3 | caller $ra | $a = 2 | L1 $ra | $a = 1 | L1 $ra |
+--------+------------+--------+--------+--------+--------+
๋ค์ ๋ผ์ธ์ผ๋ก ๋์ด๊ฐ์:
slti $t0, $a0, 1 # $t0 = ($a0 < 1)
beq $t0, $zero, L1 # if ($t0 == 0) { goto L1 }
์ฌ์ ํ $a0
๊ฐ 1์ด๋ฏ๋ก 1๋ณด๋ค ์์ง ์๊ณ , beq
๋ฅผ ๋ง์กฑํด L1
์ผ๋ก ๋์ด๊ฐ๋ค.
L1:
addi $a0, $a0, -1 # $a -= 1
jal factorial # factorial($a0)
L1
์ $a
์์ 1์ ๋นผ 0์ผ๋ก ๋ง๋ค๊ณ , factorial
๋ก ๋์ด๊ฐ๋ค.
factorial:
addi $sp, $sp, -8 # stack pointer ์์น -8 ์ด๋
sw $ra, 4($sp)
sw $a0, 0($sp)
factorial
์์๋ ๋ ๋ค์ $sp
๋ฅผ -8 ์ด๋ํ๋ค. ์ด๋ ๋ฐฑ์
๋๋ $ra
๋ ์์ ์คํํ L1
์ jal factorial
์ ๋ฐ๋ก ๋ค์ ๋ผ์ธ์ด๊ณ , $a0
๋ 0์ด๋ค. ํ์ฌ ์คํ์ ์ ์ฅ๋ ๋ ์ง์คํฐ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค:
+--------+------------+--------+--------+--------+--------+--------+--------+
| $a = 3 | caller $ra | $a = 2 | L1 $ra | $a = 1 | L1 $ra | $a = 0 | L1 $ra |
+--------+------------+--------+--------+--------+--------+--------+--------+
๋ค์ ๋ผ์ธ์ ๋ณด์:
slti $t0, $a0, 1 # $t0 = ($a0 < 1)
beq $t0, $zero, L1 # if ($t0 == 0) { goto L1 }
์ด์ $a0
๊ฐ 0์ด๋ฏ๋ก 1๋ณด๋ค ์์ $t0
๊ฐ 1์ด ๋๋ค. beq
๋ฅผ ๋ง์กฑํ์ง ์์ผ๋ฏ๋ก L1
์ผ๋ก ๋์ด๊ฐ์ง ์๊ณ ๋ค์ ๋ผ์ธ์ ์คํํ๋ค. ์ฌ๊ธฐ๊น์ง ํธ์ถ ๊ณผ์ ์ด์๊ณ , ์ด์ ๋ ๋ฐํ ๊ฐ์ ๋ฐ์์ค๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
addi $v0, $zero, 1
addi $sp, $sp, 8 # stack pointer ์์น 8 ์ด๋
jr $ra
$v0
์ 0์ 1์ ๋ํ ๊ฐ, ์ฆ 1์ ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ stack pointer ์์น๋ฅผ 8๋งํผ ๋น๊ธฐ๊ณ $ra
์์น๋ก ๋์ด๊ฐ๋ค. ์ด๋ $ra
๋ L1 $ra
์์น๋ค.
+--------+------------+--------+--------+--------+--------+
| $a = 3 | caller $ra | $a = 2 | L1 $ra | $a = 1 | L1 $ra |
+--------+------------+--------+--------+--------+--------+
stack pointer ์์น๋ฅผ 8๋งํผ ๋น๊ฒผ์ผ๋ ์คํ์ ๋ชจ์ต์ ์์ ๊ฐ์ด ๋๋ค.
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8 # stack pointer ์์น 8 ์ด๋
mul $v0, $a0, $v0 # $v0 = $a0 * $v0
jr $ra
์คํ์์ $a0
๊ฐ๊ณผ $ra
๊ฐ์ ๊ฐ์ ธ์จ๋ค. ์์ ์คํ์ ๋ชจ์ต์ ํ์ธํด๋ณด๋ฉด $a0
๊ฐ 1์ด๊ณ $ra
๋ L1 $ra
์์น๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ stack pointer์ ์์น๋ฅผ 8 ์์ง์ธ๋ค. ์ด์ด์ $v0
์ $a0 * $v0
, ์ฆ 1 * 1
๊ฐ์ ์ ์ฅํ๊ณ , $ra
์์น๋ก ๋์ด๊ฐ๋ค. $ra
๋ ์ฌ์ ํ L1 $ra
์์น๋ค.
+--------+------------+--------+--------+
| $a = 3 | caller $ra | $a = 2 | L1 $ra |
+--------+------------+--------+--------+
์์ stack pointer์ ์์น๋ฅผ 8 ์์ง์๊ธฐ ๋๋ฌธ์ ํ์ฌ ์คํ์ ๋ชจ์ต์ ์์ ๊ฐ๋ค.
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8 # stack pointer ์์น 8 ์ด๋
mul $v0, $a0, $v0 # $v0 = $a0 * $v0
jr $ra
์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. $a0
์ $ra
๋ฅผ ๋ณต์ํ๋ค. ์ด์ $a0
๊ฐ 2์ด๊ณ $ra
๋ L1 $ra
์์น๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ stack pointer์ ์์น๋ฅผ 8 ์์ง์ธ๋ค. ์ด์ด์ $v0
์ $a0 * $v0
, ์ฆ 2 * 1
๊ฐ์ ์ ์ฅํ๊ณ , $ra
์์น๋ก ๋์ด๊ฐ๋ค. $ra
๋ L1 $ra
์์น๋ค.
+--------+------------+
| $a = 3 | caller $ra |
+--------+------------+
stack pointer๊ฐ 8๋งํผ ์ด๋ํ ํ์ฌ ์คํ์ ๋ชจ์ต์ ์์ ๊ฐ๋ค.
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8 # stack pointer ์์น 8 ์ด๋
mul $v0, $a0, $v0 # $v0 = $a0 * $v0
jr $ra
์ด์ ๋ง์ง๋ง ๋จ๊ณ๋ค. ์คํ์์ $a0
์ $ra
๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ด์ $a0
๊ฐ 3์ด๊ณ $ra
๋ caller $ra
์์น๋ค. ๋ค์ stack pointer์ ์์น๋ฅผ 8 ์์ง์ด๋ฉด ์ด์ stack pointer๋ฅผ ์ด๊ธฐ ๊ฐ์ผ๋ก ๋๋ ค๋๊ฒ ๋๋ค.
$v0
์ $a0 * $v0
, ์ฆ 3 * 2
๊ฐ์ ์ ์ฅํ๊ณ , $ra
์์น๋ก ๋์ด๊ฐ๋ค. ์ด๋ $ra
๋ caller ์์น์ด๋ฉฐ, caller์์ $v0
์ ์ ๊ทผํ๋ฉด 6์ ์ป์ ์ ์์ ๊ฒ์ด๋ค. factorial
์ด ์ ๋๋ก ๋์ํ๋ค.
๋ง์น ์ธ๊ฐ ์ปดํจํฐ๊ฐ ๋ ๊ธฐ๋ถ์ด๋ค.
Memory Layout
+---------------+ High address
| Stack |
+-------+-------+
| | |
| v |
| |
| ^ |
| | |
+-------+-------+
| Heap |
+---------------+
| Static (Data) |
+---------------+
| Text (Code) |
+---------------+ Low address
๊ทธ๋ฆผ์ Code Segment๋ Text๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, ์ค์ ํ๋ก๊ทธ๋จ ์ฝ๋๊ฐ ์ ์ฅ๋๋ค. Data Segment๋ Static Data๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, ์์ ๋ฐฐ์ด์ด๋ ๋ฌธ์์ด, static ๋ณ์๊ฐ ์ ์ฅ๋๋ค. Heap์๋ ๋์ ํ ๋น๋ ๋ฐฐ์ด ์์๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ฉฐ, Stack์๋ ํจ์๋ ๋ฉ์๋, ์ง์ญ๋ณ์ ๋ฑ์ด ์ ์ฅ๋๋ค.
์์ ์คํ์ ๊ฐ์ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ค๋ ๊ณผ์ ์ด ์์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ฐํ์ผ๋ก ์ด๋ค์ง๋ค. ์คํ์ ๋์ ๊ณณ์์ ๋ฎ์ ๊ณณ์ผ๋ก ์๋ผ๊ธฐ ๋๋ฌธ์ addi $sp, $sp, -8
์ฒ๋ผ stack poniter๋ฅผ ์์ ๋ฐฉํฅ์ผ๋ก ์์ง์ฌ์ค ๊ฒ์ด๋ค. ๊ฐ์ ์ ์ฅํ ๋๋ sw $ra 4($sp)
๋ค์ sw $a0, 0($sp)
๋ฅผ ํ๋ค. ์คํ๊ณผ ๋ฌ๋ฆฌ heap์ ๋ฎ์ ๊ณณ์์ ๋์ ๊ณณ์ผ๋ก ์๋๋ค.
MIPS Instruction Formats
MIPS์์ ์ด์ ๋ธ๋ฌ๊ฐ ํ ์ค์ฉ instruction์ ์ฝ๊ณ ์ด๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ ๋, ๊ธฐ๊ณ์ด๋ฅผ ํํํ๋ ์ธ๊ฐ์ง ํ์ R(Register), I(Immediate), J(Jump)๊ฐ ์๋ค.
R-format
R-format์ ๋ ์ง์คํฐ๋ฅผ ์ด์ฉํด ์ฐ์ฐํ๋ instruction์ ๋ด๋ ํ์์ด๋ค.
+----+----+----+----+-------+-------+
| op | rs | rt | rd | shamt | funct |
+----+----+----+----+-------+-------+
- op(6bits): ํฌ๋งท๊ณผ ๋์์ ๊ตฌ๋ถํ๋ ํ๋.
- rs(5bits): first source register number
- rt(5bits): second source register number
- rd(5bits): destination register number
- shamt(5bits): shift ์ฐ์ฐ์ ์ฌ์ฉ๋๋ ํ๋.
- funct(6bits): op๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ๋ด์ ํ๋.
๋ง์ฝ ๋ค์๊ณผ ๊ฐ์ MIPS ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์:
add $t0, $s1, $s2
์ด๋ฅผ R-format์ผ๋ก ํํํ๋ฉด ์ด๋ ๊ฒ ๋ ๊ฒ์ด๋ค:
+---------+-----+-----+-----+---+-----+
| special | $s1 | $s2 | $t0 | 0 | add |
+---------+-----+-----+-----+---+-----+
register table์ ๋ฐ๋ผ ์ด๊ฒ์ 10์ง์๋ก ๋ณํํ๋ฉด:
+---+----+----+---+---+----+
| 0 | 17 | 18 | 8 | 0 | 32 |
+---+----+----+---+---+----+
๊ฐ ๋ ์ง์คํฐ์ ๊ฐ๊ณผ add
instruction์ opcode, funct ๊ฐ, rs, rt, rd ์์น ๋ฑ์ ๋ชจ๋ ์ฌ์ ์ ์ ์๋ ๊ฒ์ผ๋ก, MIPS Green Sheet๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค. ์ด์ด์ ๊ฐ ํ๋๋ฅผ 2์ง์๋ก ๋ฐ๊พธ๋ฉด ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ด๊ฐ๋ ๊ฐ์ด ๋๋ค:
00000010001100100100000000100000
์ปดํจํฐ๋ ์ด๋ ๊ฒ ๋ณํ๋ ๋ฐ์ด๋๋ฆฌ ์ซ์๋ฅผ ๋ณด๊ณ ๋ช ๋ น์ ์ํํ๋ค.
์ด๋ ๊ฒ ๋ณด๋ฉด ๋ฐ๋ก funct๋ฅผ ํ์ธํ๋ฉด ๋๋๊น op๊ฐ ํ์ํ์ง ์์ ๊ฒ ๊ฐ๋ค. ์ฌ์ค 32bit ์์คํ ์์ ์ฝ๊ฒ instruction์ ์ฝ๊ธฐ ์ํด 32๋นํธ๋ฅผ ๋ง์ถ๋ ๊ฒ์ด ๋ณต์ก๋๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ํด๋ฅผ ๊ฐ์ํ ๊ฒ์ด๋ค.
I-format
I-format์ ์์ ์ฐ์ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํด ์ฌ์ฉ๋๋ค.
+----+----+----+-----+
| op | rs | rt | IMM |
+----+----+----+-----+
- op(6bits): ํฌ๋งท๊ณผ ๋์์ ๊ตฌ๋ถํ๋ ํ๋.
- rs(5bits), rt(5bits): source or destination register number
- IMM(16bits): constant๋ address๊ฐ ๋ด๊ธด๋ค. constant์ ๊ฒฝ์ฐ -215๋ถํฐ 215 - 1๊น์ง์ ์์๋ฅผ ์ ์ฅํ ์ ์๋ค. address์ ๊ฒฝ์ฐ rs์ base address์ offset์ผ๋ก ๊ธฐ๋ฅํ๊ฑฐ๋ ์ ํํด์ผ ํ๋ instruction๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ค.
J-format
J-format์ ๋ค๋ฅธ ์์น๋ก ์ ํํ ๋ ์ฌ์ฉ๋๋ ํฌ๋งท์ด๋ค.
+----+----------------+
| op | pseudo-address |
+----+----------------+
- op(6bits): ํฌ๋งท๊ณผ ๋์์ ๊ตฌ๋ถํ๋ ํ๋.
- pseudo-address(26bits): ์ ํํ instruction์ ๋ณํ๋ ์ฃผ์๊ฐ ๋ด๊ธฐ๋ ํ๋.
MIPS Addressing for 32-bit Immediates and Addresses
MIPS instruction format ์ค I-format์ bne $t0, $s5, Exit
์ ๊ฐ์ ๊ตฌ๋ฌธ์ ํํํ ๋๋ ์ฌ์ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ I-foramt์ ๋ง์ง๋ง ํ๋์ธ constant or address๋ 16bits๋ฐ์ ๋์ง ์์ Exit
์์ ์ํ๋ ๋์ ์ ์ฒด๋ฅผ ๋ด๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ์ด๊ณณ์๋ Exit
๊ฐ ๋ช ์ค ๋จ์ด์ ธ ์๋์ง๋ฅผ ์ ์ฅํ๋ค. ์์ ํ์ฉํ Loop ์ฝ๋๋ฅผ ๋ค์ ๋ณด์:
Loop: # address: 8000
sll $t1, $s3, 2 # R-format: | 0 | 0 | 19 | 9 | 4 | 0 |
add $t1, $t1, $s6 # R-format: | 0 | 9 | 22 | 9 | 0 | 32 |
lw $t0, 0($t1) # I-format: | 35 | 9 | 8 | 0 |
bne $t0, $s5, Exit # I-format: | 5 | 8 | 21 | 2 |
addi $s3, $s3, 1 # I-format: | 8 | 19 | 19 | 1 |
j Loop # J-format: | 2 | 2000 |
Exit:
...
์ฌ๊ธฐ์ bne $t0, $s5, Exit
๋ผ์ธ์ I-format์ ๋ณด์. constant or address์ 2๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ์ด๋ Exit๊ฐ ํด๋น ๋ผ์ธ์์ 2์นธ ๋จ์ด์ ธ ์๋ค๋ ์๋ฏธ๋ค.
J-format์ ๊ฒฝ์ฐ๋ pseudo-address ํ๋๊ฐ 26bits๋ฐ์ ๋์ง ์์ ๋ชจ๋ instruction์ ๋ด์ ์ ์๋ค. J-format์ pseudo-address ํ๋์๋ ์ ํํด์ผ ํ๋ ์์น์ ์ฃผ์๋ฅผ 2๋งํผ right shiftํ ๊ฐ์ด ๋ค์ด๊ฐ๋ค. ์ ์ฝ๋์์ j Loop
๋ผ์ธ์ J-format์ ๋ณด์. pseudo-address ํ๋์ 2000์ด ์๋๋ฐ, ์ ํํด์ผ ํ๋ Loop
์ address๋ 8000์ด๋ค. ์ด๋ 2000์ 2๋งํผ left shift(2000 << 2
)ํ๋ฉด 8000์ ์ป์ ์ ์๋ค.
์์ ๊ฐ์ ๋งค์ปค๋์ฆ์ ์ํํ๊ธฐ ์ํด ์ด์ ๋ธ๋ฌ๋ ๊ตฌ์ฒด์ ์ธ instruction์ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๊ธฐ ์ ์ฝ๋ ์ ์ฒด๋ฅผ ์ค์บํด ๋ผ๋ฒจ์ ์์น๋ฅผ ํ์ ํ๋ค. ์ดํ ์์๋๋ก instruction์ ์ฝ์ผ๋ฉฐ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ค๊ฐ ์ ํํด์ผ ํ๋ ๋ถ๋ถ์ด ๋์ค๋ฉด ๊ทธ ๋ถ๋ถ์ instruction์ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ค. ์ด๋ฐ ์์ผ๋ก ๋ชจ๋ instruction์ ์์์ ๋ง์ถฐ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ฉด ๋น๋ก์ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ๊ฒฐ๊ณผ๋ฌผ์ด ๋์จ๋ค.
์ฌ๊ธฐ๊น์ง๊ฐ MIPS instruction์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ด๋ค. ๋ ๋ค์ด๊ฐ๋ฉด ํ๋ก์ธ์, ๋ฉ๋ชจ๋ฆฌ์ ๋์์ด๋ ๋์งํธ ํ๋ก๋ฅผ ์ด์ฉํ ๋ฐ์ด๋๋ฆฌ ์ฐ์ฐ์ ๋ํ ๋ด์ฉ๋ ๋ค๋ฃฐ ์ ์์ ๊ฒ ๊ฐ์๋ฐ, ์ผ๋จ์ ์ปดํจํฐ ์ํคํ ์ฒ์ ๊ฐ์์ ์ปดํจํฐ๊ฐ ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๋ ๊ณผ์ ๋ง์ ์ดํด๋ดค๋ค.