Lay Sukmin Lim
Frond-end Developer Javascript Engineer
MIPS 인스트럭션과 동작과정
MIPS(Microprocessor without Interlocked Pipeline Stages)
RISC(Reduced instruction set computer)
MIPS란? MIPS Technologies에서 개발한 RISC 기반의 명령어 집합 체계.
RISC 표준 중 하나로 많은 임베디드 기기 및 콘솔게임기기에 사용되고 있다.
RISC란? CPU 명령어의 개수를 줄여 하드웨어 구조를 좀 더 간단하게 만드는 방식으로, 마이크로프로세서를 설계하는 방법 가운데 하나이며 ARM, MIPS 등의 아키텍처에서 사용된다.
CISC와는 다르게 명령어 길이를 16bit 혹은 32bit로 일정하게 정리하고, 명령어 포맷을 일정하게 다듬었다.
RISC와는 반대로 명령어 길이가 제각각이고, 명령어 포맷이 중구난방이지만 복잡한 명령도 하나의 명령어로 실행되어 실행효율이 좋다.
우리가 흔히 쓰는 CPU인 Intel과 AMD가 x86 혹은 x86-64라는 CISC 형식의 CPU를 생산한다.
CPU가 해야하는 작업을 지시하는 정형화된 명령어.
각 기능을 정의 해서 ROM에 저장한 후 해당 기능이 필요할 때 저장된 명령어를 사용한다.
인스트럭션은 operation code, operend 등으로 구성된다.
각 CPU마다 정의되는 instruction이 다르다.
Instruction이 실행 될 때 연산이 되어야 할 변수들이 저장되는 공간.
용도에 맞도록 저장공간의 이름을 붙어있다.
프로그래머가 직접 사용하지 못하는 특수하게 사용되는 공간도 존재한다.
2개의 인자를 사용하여 다른 1개의 인자에 값을 저장하는 명령어.
MIPS상에서 대표적인 R-type으로는 ADD와 SUB가 있다.
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
R-Type과 비슷하지만 두개의 인자중 하나의 인자를 상수로 사용한다.
주로 메모리에 접근하여 값을 가져오거나 저장할 때 사용한다.
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 |
OP 코드와 상수값으로만 이루어진 Instruction.
보통 GOTO 문을 발동시킬 때 사용한다.
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
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 }
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
By Lay Sukmin Lim