[컴퓨터 구조] MIPS(Microprocessor without Interlocked Pipelined Stages)

2020. 6. 10. 22:00컴퓨터 구조

 

 

[컴퓨터 구조] ISA(Instruction Set Architecture)

ISA(Instruction Set Architecture) 컴퓨터 언어에서 명령어(Instruction) 는 단어를 명령어 집합(Instruction set)은 어휘라고 말할 수 있다. 그리고 이러한 명령어 집합을 들을 모아 문장을 만든 것이 ISA(Ins..

jyukki.tistory.com

이전 포스트를 통해 ISA가 무엇인지알았다면,

 

MIPS를 통해 실제 ISA가 어떤 구조로 되어 있는지 알아보도록 하겠다.


MIPS가 개발되기 전에 사람들은 이러한 생각을 하였다.

 

"성능을 최대화하고, 비용을 최소화하면서,

하드웨어 및 컴파일러를 쉽게 구축 할 수있는 언어를 찾습니다."

 

MIPS는 개발자들의 이러한 needs를 충족시키기 위해 개발되었고,

 

그렇기에 MIPS를 설계할 때의 만들어진 설계 원칙들이 있다.

 

 

1. 간단하게 하기 위해서는 규칙적인 것이 좋다.

규칙성으로 인해 구현이 단순해집니다
단순해진 구현은 저렴한 비용으로 더 높은 성능얻을 수 있게 해줍니다.

 

2. 작은 것이 더 빠르다.

ex) 레지스터의 갯수를 32개로 제한함

 


3. 자주 일어나는 일을 더 빠르게

ex) 0을 자주 사용하므로 0만 사용할 수 있는 레지스터인 $zero 레지스터를 만듦

 

4. 좋은 설계는 적당한 타협을 요구한다.

ex) 필요없는 공간이 있더라도 가능한한 형식을 비슷하게 만듦
32비트 명령어를 균일하게 허용

 

MIPS의 명령어 길이는 명령어 마다 동일하고(RISC구조),

 

각각의 명령어는 word단위로 이루어져 있다.


word

컴퓨터에서 자연스러운 접근단위(명령어 1개)
MIPS 레지스터의 크기(32bit)를 나타낸다.


8 bit = 1 byte

 

4 byte = 1 word

 

00000000000000000000000000000000

31                                                              0


word는 수평 or 수직으로 그릴 수 있어,

단순히 오른쪽에 있다고 오른쪽 비트라고 부르기 애매하다.

그래서 사용하는 것이

 

LSB(Least Significant Bit)
가장 오른쪽 비트(0 번째 비트)

MSB(Most Significant Bit) 
가장 왼쪽 비트(31 번째 비트)


MIPS의 명령어들은 32bit로 이루어져 있고,

각각의 명령어 형식이 비슷하게 되어있다.

 

WHY?

 

설계원칙 1, 간단하게 하기 위해서는 규칙적인 것이 좋다.

 

 

c언어
a = (b + c) - (d + e)

a, b, c, d, e 가 $s0 ~ $s4 까지 저장되어 있다고 가정

여기서 $s0 ~ $s4는 레지스터를 의미한다.

MIPS 명령어
add $t0, $s1, $s2
add $t1, $s3, $s4
sub $s0, $t0, $t1

MIPS 레지스터


MIPS의 레지스터의 개수는 32개로 이루어져 있다.

WHY?

설계원칙 2, 작은것이 빠르다.

레지스터의 개수를 32개로 제한함으로써 속도를 올리는 방식을 취했다.

Number Name Comments
$0 $zero 항상 0으로 고정되어 있다.
$1 $at Assembler를 위해 예약된 레지스터
$2, $3 $v0, $v1 함수로 부터 return된 값을 저장하는 레지스터
$4, ..., $7 $a0, ..., $a3 함수의 인수를 저장하기 위한 레지스터
$8, ..., $15  $t0, ..., $t7 값을 임시로 저장하기 위해 사용하는 레지스터
$16, ..., $23 $s0, ... $s7 오랫동안 지속되는 값을 저장할 때 사용하는 레지스터
$24, $25 $t8, $t9 값을 임시로 저장하기 위해 사용하는 레지스터
$26, $27 $k0, $k1 커널(Operating System)을 위해 예약된 레지스터
$28 $gp Global pointer의 값을 저장하는 레지스터
$29 $sp Stack pointer의 값을 저장하는 레지스터
$30 $fp Frame pointer의 값을 저장하는 레지스터
$31 $ra Return되는 곳의 주소값을 저장하는 레지스터

 

MIPS 에서는 값이 0으로 묶여있는

$zero라는 레지스터가 존재

 

설계원칙 4, 자주 생기는 일을 빠르게 

 

C code :

int example(int g, h, i, j)
{
	int f;
    f = (g + h) - (i + j);
    return f;
}

 

함수의 인수인 g, h, i, j 는 $a0, ... $a3에 저장된다.

 

f 는 $s0에 저장된다.

 

rerurn 값은 $v0에 저장된다.

 

MIPS code :

Memory Layout


stack


sp(Stack pointer)

stack내부에서 현재 위치를 나타내는 포인터

 

fp(Frame pointer)

함수가 호출되기 전 sp의 복사본
함수가 종료되면, sp의 값은 fp의 값으로 복원된다. 

 

결국 현재 Frame에서 사용되고 있는 stack의 사이즈

fp ~ sp 까지의 크기가 될 수 있다.


MIPS 명령어


R-타입(Register-type)

산술 연산, 논리 연산, 시프트 연산 등

I-타입(Immediate-type)

상수 연산, 메모리 load, store, branch 등

J-타입(Jump-type)

jump

 

설계원칙 1. 간단하게 하기 위해서는 규칙적인 것이 좋다.

 

그러나 각 타입별로 형태가 다르다

 

WHY?

 

설계원칙 4. 좋은 설계는 적당한 타협을 요구한다.

 

R-타입을 유지하면서 상수연산을 수행하기에는 너무 적은 수의 계산밖에 되지않아 효율적이지 못한다.

 

즉, 명령어의 길이와 형식은 최대한 비슷하게 유지하되,

 

형태를 조금씩 다르게 하여 효율을 올렷다.