CS

MIPS-Instruction

Junly_21 2021. 10. 5. 00:24

이런 식의 MIPS Assembly가 있다고 해보자. 이 식은 s1과 s2를 더해서 t0에 저장한다는 밉스 인스트럭션이다. 사실 이 명령 자체가 컴퓨터에는 0x02324020 의 기계어로 표현이 된다.

 

밉스 레지스터 하나는 32비트의 크기를 가지기 때문에 machine instruction또한 32비트로 제공된다. 

 

밉스가 이해하는 인스트럭션은 크게 3종류이다.

R포맷과 I포맷과 J포맷이다. 

인터넷에서 찾아볼 수 있는 mips instruction table

위의 테이블의 빨간 줄을 보면, 어떤 instruction들이 어떤 format에 속하는지 그리고 그 format은 어떻게 구성되어있는지 나타나있다. 이를 모두 외우거나 할 필요없이 표를 참고하여 적용하면 된다. 표를 보니, add는 R포맷에 있는것을 확인할 수 있다.

 

R Format

R포맷으로 설명을 이어보자면, 컴퓨터는 맨 앞의 opcode와 맨뒤의 funct로 어떤 명령을 수행하는지 받는다.  

 

R포맷에 rd=rs+rt로 되어있고, opcode와 funct를 확인할 수 있다.

rd= rs + rt로 되어있는걸 보니, R format 형식의 rs, rt, rd에는 s1, s2, t0이 들어갈 것이다.

(주의: add 연산은 t0, s1, s2의 순서로 어셈블리가 표현되고 테이블에서도 rd = rs + rd순서이지만, R format table에서는 rs rt rd 순서로 나열되어있다. 순서를 잘 확인할 것)

밉스 레지스터 표

rs와 rt와 rd를 보자. 각각 5비트씩 가지고 있고 이는 0~31을 의미한다. 이 mips register표의 번호에 해당하는 s1, s2, t0 의 레지스터가 rs rt rd로 가는것이다.

s1 = 17

s2 = 18

t0 = 8

 

즉 확인한 opcode, rs, rt, rd, (shamt는 0), funct는 16진수로 20이다. 하여 다음 사진을 이해할 수 있다.

 

 

32비트를 4자리씩 끊어 16진수로 써내면 이 글의 맨 위에 언급한 add어셈블리의 기계어(Machine Code)가 되는 것이다.

 

다음과 같은 기계어는 어떻게 연산될까? 우선 0X02724022임을 인지하고 시작하자.

1. 16진수를 모두 2진수로 바꿔준다 (0000 0010 0111 0010 0100 0000 0010 0010)

2. R포맷에 나타난 비트수에 맞게 끊어준다. (000000 10011 10010 01000 00000 100010)

3. opcode는 0, rs =19 = $s3, rt = 18 = $s2, rd = 8 = $t0, shamt=0,   funct는16진수로 100010 = 0x22 = subtract (Mips Table을 다운받는걸 추천)

 

operation은 rd = rs - rt 이므로 

sub $t0, $s3, $s2가 된다.