-RISC기반의 명령어 집합체계
-High-level language를 컴파일러가 mips 코드로 변환시켜줌
-한 줄당 한 개의 instruction이 들어감
예를 들어 f = ( g + h ) - ( i + j )는 MIPS코드로 다음과 같이 표현할 수 있다.
(↑여기서 $t는 temporary register, $s는 saved register)
그리고 arithmetic instruction 연산은 MIPS의 register 내에서 일어나는 과정이므로, 이를 memory와 연동하는 data transfer 과정이 필요하다. 이때 lw(load word), sw(store word)를 사용한다.
예를 들어
A의 base address(A[0]), h의 값을 각각 $s3, $s2라고 하면
lw $t0, 32($s3)
add $t0, $t0, $s2
sw $t0, 48($s3)
여기서 왜 A[8], A[12]를 표현 할때 index에 4를 곱해서
$s3+32, $s3+48 라고 표현했을까?
여기서 등장하는것이 Alignment restriction이다.
앞으론 왜 4를곱하는지 언급 안할거다! 알아두자!
이제 MIPS코드가 어떻게 machine language로 변환되는지 알아보자.
우선 register들은 각각 할당된 bit가 있는데,
$s0 ~ $s7은 16~23,
$t0 ~ $t7은 8~15, $t8 ~ $t9는 24~25번째 bit에 할당되어있다.
(대부분의 코드는 $t7까지로 표현이 되므로 t8,t9는 예외의 경우를 위해 존재하므로 떨어져서 할당.)
이제
add $to, $s1, $s2를 표현해보자!
다음과 같이 표현된다. add instruction이라서 R-format으로 표현됐는데, 아직 와닿지 않을것이다.
먼저 R-format 과 I-format을 살펴보자.
R-format (일반적으로 arithmetic이나 logit operation에 사용)
op,func => 어떤 instruction이냐를 의미한다.
rs,rt,rd => 3개의 operhands를 의미한다.
shamt => shift amount. 아래서 다시 언급할 예정이니, 눈에 익혀만 두자.
I-format (메모리에 접근하는 instruction, branch instruction에 사용)
op => 어떤 instruction이냐를 의미한다.
rs,rt => source,target register를 의미한다.
constant or address => 주소값 또는 상수
이제 이 그림으로 돌아와보자.
opcode가 0, func 부분이 32라는것은 add instruction이라는 것을 의미한다.
add이므로 shamt부분은 사용되지 않았고,(bit를 shift할 필요가 없음)
rs,rt,rd부분은 first,second, destination register을 의미하는것이다.
아래 표를 보면 이해가 훨씬 쉽다!
이제 논리 연산을 알아보자.
and나 or은 알겠는데, sll과 srl은 뭘까?