MIPS

MIPS 인스트럭션과 동작과정

목차

  • MIPS 그리고 RISC
  • Instruction and Register
  • MIPS의 Instruction
  • MIPS 어셈블리어 해독

MIPS and RISC

MIPS(Microprocessor without Interlocked Pipeline Stages)

RISC(Reduced instruction set computer)

MIPS

MIPS란? MIPS Technologies에서 개발한 RISC 기반의 명령어 집합 체계.

 

RISC 표준 중 하나로 많은 임베디드 기기 및 콘솔게임기기에 사용되고 있다.

RISC

RISC란? CPU 명령어의 개수를 줄여 하드웨어 구조를 좀 더 간단하게 만드는 방식으로, 마이크로프로세서를 설계하는 방법 가운데 하나이며 ARM, MIPS 등의 아키텍처에서 사용된다.

 

CISC와는 다르게 명령어 길이를 16bit 혹은 32bit로 일정하게 정리하고, 명령어 포맷을 일정하게 다듬었다.

CISC

RISC와는 반대로 명령어 길이가 제각각이고, 명령어 포맷이 중구난방이지만 복잡한 명령도 하나의 명령어로 실행되어 실행효율이 좋다.

 

우리가 흔히 쓰는 CPU인 Intel과 AMD가 x86 혹은 x86-64라는 CISC 형식의 CPU를 생산한다.

Instruction and Register

저장된 것과 저장되어질 곳

Instruction

CPU가 해야하는 작업을 지시하는 정형화된 명령어.

 

각 기능을 정의 해서 ROM에 저장한 후 해당 기능이 필요할 때 저장된 명령어를 사용한다.

 

인스트럭션은 operation code, operend 등으로 구성된다.

 

각 CPU마다 정의되는 instruction이 다르다.

Register

Instruction이 실행 될 때 연산이 되어야 할 변수들이 저장되는 공간.

 

용도에 맞도록 저장공간의 이름을 붙어있다. 

 

프로그래머가 직접 사용하지 못하는 특수하게 사용되는 공간도 존재한다.

MIPS의 Instruction

Type R, I, J

R-Type

2개의 인자를 사용하여 다른 1개의 인자에 값을 저장하는 명령어.

 

MIPS상에서 대표적인 R-type으로는 ADD와 SUB가 있다.

R-Type

  • op(6) : operation code
    (instruction의 종류)를 표기
  • rs(5) : 첫번째 operand의 register의 주소
  • rt(5) : 두번째 operand의 register의 주소
  • rd(5) : 연산결과를 저장하기 위한 register의 주소
  • shamt(5) : shift연산의 양을 표기하기 위한 값.
  • funct(6) : op와 같은 역활을 함. op 확장기능

R-Type - Exam

A = B + C라는 MIPS가 처리하는 과정을 예제로 한다.

 

이때 A = r16, B = r8, C = r9에 저장하고 ADD의 operation code는 32라고 가정한다.

 

ADD      $r16, $r8, $r9

op(6) rs(5) rt(5) rd(5) shamt(5) funct(6)
0 8 9 16 0 32

000000 01000 01001 10000 00000 100000

I-Type

R-Type과 비슷하지만 두개의 인자중 하나의 인자를 상수로 사용한다.

 

주로 메모리에 접근하여 값을 가져오거나 저장할 때 사용한다.

I-Type

  • op(6) : operation code
    (instruction의 종류)를 표기
  • rs(5) : 하나의 operand의 register의 주소
  • rt(5) : 연산결과를 저장하기 위한 register의 주소
  • immediate(16) : 다른 하나의 operand값이 될 상수

I-Type - Exam

int Array[], int Temp라는 변수가 존재

 

Array[2] =  Temp + Array[4]를 MIPS가 처리하는 과정을 예제로 한다.

 

이때 Array[0] = r18, Temp = r16을 각각 저장하고 ADD의 operation code는 32, LW의 operation code는 35라고 가정한다.

LW         $r8, 16($r18)

ADD     $r8, $r16, $r8

op(6) rs(5) rt(5) immediate(16)
35 18 8 16
op(6) rs(5) rt(5) rd(5) shamt(5) funct(6)
0 8 16 8 0 32

J-Type

OP 코드와 상수값으로만 이루어진 Instruction.

 

보통 GOTO 문을 발동시킬 때 사용한다.

J-Type

  • op(6) : operation code
    (instruction의 종류)를 표기
  • address(26) : 명령어를 실행시킬때 필요한 상수 값

MIPS Instruction Set - R Type

add      rd,rs,rt     # rd = rs + rt

sub      rd,rs,rt      # rd = rs - rt

and      rd,rs,rt      # rd = rs & rt

or      rd,rs,rt      # rd = rs | rt

slt      rd,rs,rt      # if(rs < rt) { rd = 1 } else { rd = 0 }

jr      rs      # goto rs

MIPS Instruction Set - I Type

addi  rd,rs,constant   # rd = rs + constant

lw      rt, address        # read data from memory 'address'

sw      rt, address       # write data from memory 'address'

lb      rt, address         # read 1byte data from memory 'address'

sb      rt, address        # write 1byte data from memory 'address'

bnq     rs, rt, address # if(rs == rt) { goto $PC + 4 + offset }

bne     rs, rt, address # if(rs != rt) { goto $PC + 4 + offset }

slt      rd,rs,constant   # if(rs < constant) { rd = 1 } else { rd = 0 }

Read Assembler 

(maybe) readable MIPS

add      rd,rs,rt               # rd = rs + rt
sub      rd,rs,rt               # rd = rs - rt

addi   rd,rs,constant   # rd = rs + constant

addiu rd,rs,constant   # rd = rs + constant(unsigned)

lw        rt, address        # load data from memory 'address'

sw       rt, address        # store data from memory 'address'

bnq     rs, rt, address   # if(rs == rt) { goto $PC + 4 + offset }

bne     rs, rt, address   # if(rs != rt) { goto $PC + 4 + offset }

move rs, rt                   # rt의 값을 rs로 이동

and      rd,rs,rt              # rd = rs & rt
or      rd,rs,rt                 # rd = rs | rt
slt      rd,rs,rt                 # if(rs < rt) { rd = 1 } else { rd = 0 }
jr      rs                            # goto address in rs

j        address                 # goto address

nop                                 # do nothing

MIPS

By Lay Sukmin Lim

MIPS

  • 283