반응형

0. MIPS 명령어 형식

add $s1, $s2, $s3

lw $s1, 20($s2)

등 여러가지 명령어가 있는데, 이때 $기호가 붙은것들은 레지스터이고, 안붙어있거나 괄호앞에 있는건 상수이다.

1. MIPS 명령어 종류

MIPS 명령어는 엄청 다양하지만 그것도 3가지 종류로 나뉜다. R타입, I타입, J타입이 속해있다.

 

1-1 R타입

R타입의 특징은 상수를 받지 않는다는 것이다( 대부분 3개의 레지스터를 받는다.)

 

ex)

add $s1, $s2, $s3 -> $s1=$s2+$s3 와같은 3개의 레지스터를 이용한 산술연산 (add, sub등)

and $s1, $s2, $s3 -> $s1 = $s2&$s3 와같은 3개의 레지스터를 이용한 비트연산(and, or, nor등)

그외에 slt(2번째 3번째 레지스터 비교후 1번째에 값저장) sll srl(쉬프트연산)등이있다.

 

1-2 I타입

I타입의 특징은 상수와 레지스터 모두를 받는다는 것이다. 일반적으로 레지스터 2개와 상수1개를 받는다.

 

ex)

addi, andi, ori등 R타입에서 한개의 레지스터가 상수로 바뀌는 명령어

lw $s1,20($s2) $s1=Memory[$s2+20] s2+20의 메모리에서 가져오는 연산(lw, sw, lb등 메모리 관련연산)

등이 대표적인 I타입 연산이다. 

 

1-3 J타입

J타입의 특징은 한개의 상수만 받는다는 것이다. j jal이 대표적인데, 그냥 어떤 위치로 넘어가기 위해쓴다.

(주로 함수 call할때 많이 쓰는 편이다)

 

2. MIPS 명령어가 기계어로 바뀌는 방식

1. 위의 표를 설명하자면, 일단 표에 적혀있는 숫자는 bit로 MIPS의 모든명령어는 32bit(4byte)이다.

2. 명령어를 구별하는건 opcode와 R타입에서는 Funct이다. 저게 명령어마다 숫자가 달라지면서 실행된다.

 

궁금증1? 왜 구지 R타입은 Funct를 따로 두고 opcode는 0으로 두는가? 

답: opcode는 6bit로 128가지의 명령어만 표현할수 있지만, 저런식으로 하면 I,J합쳐서 127가지, R도 127가지가 가능.

 

3. rs, rt, rd는 레지스터로 일반적으로 rs, rt가 주는 레지스터, rd가 받는 레지스터가 된다. 

따라서 add의 경우 $s1, $s2, $s3일때 $s1이 rd가 되는것 보면 어셈블리 순서가 지켜지지는 않는다.

 

4. shamt의 경우, shift연산을 위한 전용공간인데

sll $t2, $s0, 4라고 쳤을때, rs를 쓰지않고, rd에 $t2, rt에 $s0 그리고 shamt에 4를 집어넣는다.

 

궁금증2? 왜 rs를 안쓰고 shamt라는 공간을 따로 만들었는가?

답:하드웨어 구조적으로 rs자리는 바로 레지스터를 읽기위해 register file로 접근하기 때문

 

5. I타입과 J타입의 경우 다양한 이유로 상수를 사용하는데, 일반적인 상수값을 사용하기 위해서는 16bit와 26bit가 문제가 되지 않는다. 하지만, 주소를 위해서는 크기적인 문제가 생긴다.

I타입은 16bit로 일반적으로 함수접근보다는 반복문용도로 주소를 사용하는데, 16bit로 해결하기 위해서 

PC상대 주소지정을 사용한다. (program counter- 현재명령어 주소가 주어진 레지스터)

PC상대 주소지정은 program counter를 기준으로 +- 얼마인지에 대한 상수를 주는 방식이다.

 

J타입의 경우 함수접근으로 사용하는데, 26bit이지만 명령어는 4의 배수임을 이용해 2bit를 빼서 실질적으로 28bit처럼 작동한다. 28bit면 한개 process의 주소를 위해서는 가능하기 때문에, 주로 28bit로 그냥 사용한다.

 

 

 

반응형

+ Recent posts