MIPS 명령어 구조

1 minute read

MIPS 명령어

MIPS는 마이크로프로세서다.
그리고 그 프로세서가 일을 하게 하는 어셈블리어가 존재한다.

이전까지 다뤄왔던 NASM 어셈블리어가 CISC 였던 것과 달리,
이는 RISC 프로세서이다.
MIPS 의 명령어는 굉장히 축소되어 있으며,
이는 프로세서의 동작과 구조의 효율성을 위함이다.

예를 들어 MIPS 엔 NASM 과 달리 다양한 분기문이나
보수를 구하는 not 명령어도 없으며,
명령어의 길이가 한정적이다.

MIPS 명령어는 총 32비트로,

op rs rt rd shamt funct
opcode (register) source target destination shift amount function code
6비트 5비트 5비트 5비트 5비트 6비트

로 이루어져있다.
단, 이는 R타입 명령어일 때 한정이며,
I(immediate) 타입 명령어일 땐 rd부터의 16비트는 상수 혹은 주소로 쓰인다.

주소 지정

의사 직접 주소 지정

명령어의 주소가 32비트인데 MIPS 명령어가 32비트로 이루어져 있으므로
명령어 유형에 따라 한정된 비트의 수로 32비트의 명령어를 만들어야 한다.

이때 주소를 지정하는 방식은 명령어에 따라 다른데,
jump 명령어에서는 앞의 opcode 부분 6비트를 제외하고
뒤의 26비트를 주소로 쓸 수 있으므로,
PC의 상위 4비트 + 명령어의 주소 필드 * 4 를 주소로 쓴다.

이는 점프가 일어날 때 PC의 값이 크게 바뀌지 않는다는 가정하에 가능한 것이다.
(앞에서 4번째 비트는 2^28 자리이기 때문에 약 6400만 개 명령어 범위 내에서 유효하다.)

이 방법을 의사직접 주소지정 방식이라고 한다.

PC 상대 주소 지정

bne 혹은 beq 는 세 개의 operand 를 가진다.
op / rs / rt / 주소

각 6, 5, 5, 16비트가 되는데, 이때 rs와 rt를 비교한 후 점프를 할 시에
현 PC + 4 + 주소 * 4 를 주소로 삼는다.

실제 주소를 값으로 가지는 것이 아닌,
해당 명령어로부터 얼마나 떨어져있는지가 값으로 들어가는 것이다.

예를 들어 분기될 주소와 분기문이 2워드(= 8바이트) 떨어져 있다면
해당 PC의 다음 명령어로부터 2번 간 명령어를 실행시킨다.

이 방법을 PC 상대 주소 지정이라고 한다.

요약

명령어는 R, I, J 형식으로 나뉜다.

R 타입 명령어는
op | rs | rt | rd | shamt | funct |

I 타입 명령어는
op | rs | rt | 16비트 변위 |

J 타입 명령어는
op | 26비트 점프 주소 |

의 명령어 형식을 갖는다.