#2. MIPS ISA에 대해(명령어 집합)(1)
컴퓨터구조론 2023. 11. 17. 01:41우리 강의에서는 MIPS 아키텍쳐에 대해 배우고 넘어간다. 이는 나중에 x86, arm등의 아키텍쳐에 비해서는 구식에 해당하지만, 명령어 체계가 단순하여 기초를 쌓기에 좋은 아키텍쳐이기에 많은 대학들에서 컴퓨터구조를 배울때 채택하고 있는 아키텍쳐이다. 또한 여전히 mips ISA는 임베디드 프로세서에서도 쓰이고 있기 때문에, 가장 기초적이고도 단순한 명령어체계라 할 수 있겠다.
MIPS(Microprocessor without Interlocked Pipeline Stages)는 MIPS 테크놀로지에서 개발한 RISC ISA이다.
RISC(Reduced Instriction Set Computer)는 명령어 체계중 한가지로, 복잡한 처리는 소프트웨어에게 맡기고, 명령어세트의 복잡성은 줄인 방식을 의미한다.
ISA는 Instruction Set Architecture 로 쉽게 이야기하면 명령어집합을 의미한다. 복잡한 용어들을 쓰는 것 같지만, 직접 실습을 해보면 정말로 명령어 몇십개의 집합임을 알 수 있다. 현재 arm , x86 등도 마찬가지로 mips와 비슷하게 명령어 집합을 가지고 있는 것이고 이것이 하나의 아키텍쳐가 되어 우리가 이용하고 있는 것이다.
MIPS – The New Standard in Open Use ISAs
780 Montague Expressway, Suite 308 San Jose, CA 95131 USA | Tel: +1 408 412 8645
mips.com
이곳이 MIPS 아키텍쳐를 만들었던 회사이자, 현재는 RISC-V 개발을 이어가고 있다.
MIPS 의 명령어셋이다, 물론 이외에도 명령어가 다양하게 있지만, 가장 많이 쓰이는 것들 위주로 작성되어 있는 것이다. 겁먹을 것 없이, 제품의 설명서를 뜯어보듯이 생각하면 되겠다. 첫 줄에 add라는 명령어 뒤에 3개의 변수를 쓰면 덧셈이 이루어진다는 것이고, sub를 쓰면 뺄셈이 이루어진다. 이런식으로 생각하면 충분하다.
자, 이제 이 명령어들을 해석하기 위해 몇가지만 알고 넘어가도록 하겠다.
MIPS는 32개의 Register로 구성되어 있다. 32bit register라고 이야기하기도 하며, 이 32개의 register에 값이 저장된다. 1개의 register는 32bit로 이루어져 있기 때문에, 결국 레지스터를 통해 32*32 = 1024개의 0과 1을 한번에 저장해서 사용할 수 있음을 의미한다.(32개의 register를 한번에 연산한다는 것은 아님, 0과 1이 저장되어 있고, 이를 연산할때에는 2~3개 정도의 레지스터만을 동시에 쓸 수 있음)
1개의 register 안에는 32bit가 저장되고 이 32bit는 1개의 word라고 이야기한다. 컴퓨터는 이 32bit 를 한번에 인식할 수 있고, 이것이 32bit 컴퓨터라고 불리는 것이다.(우리는 현재 64bit 컴퓨터를 많이들 사용하므로, 한번에 64bit를 받아들인다는 것이다.) register가 많을수록 더 많은 정보를 한번에 처리할 수도 있지만, 대신 처리하는 속도가 느려져 버리기 때문에 적절한 수의 register을 사용하는 것이 중요하다.
이 register에서 실제 연산이 이루어지고, 보통은 memory에서 값을 register로 불러들이고, register에서 연산을 한 후에 다시 memory로 저장되는 과정을 거쳐 우리가 사용하는 컴퓨터가 동작하게 되는 것이다.
가장 헷깔렷던 것이 register도 32개, register 안에는 32bit가 있다고 하니깐 헷깔리는 경우가 많았다. 한번에 2~3개의 register을 연산하는데 활용하고, 1개의 register 안에 32개의 0과 1을 인식한다는 것으로 생각하면 헷깔리지 않겠다.
위 표는 MIPS의 32개의 레지스터가 어떤 역할을 맡고 있는지 나타낸 표이다. $기호를 활용하여 $0~$31로 표현하기도 하지만, 좀 더 역할을 부여하기 위해서 Conventional Name을 부여하기도 한다. 하나씩 살펴보면 다음과 같다.
Register 번호 | 역할(Conventinal name) | 용도 |
0 | zero | 언제나 0, 일부러 다른 값을 넣으려고 해도 0 |
1 | at | 임시변수 |
2~3 | v0,v1 | 함수로부터 결과값 반환 변수 |
4~7 | a0~a3 | 함수에 전달할 값 변수 |
8~15 | t0~t7 | 임시변수 |
16~23 | s0~s7 | 저장변수 |
24~25 | t8~t9 | 임시 변수 |
26~27 | k0~k1 | 운영체제 임시변수(사용하지 않음) |
28 | gp | 전역 포인터 |
29 | sp | 스택 포인터 |
30 | fp | 프레임 포인터 |
31 | ra | 함수 반환 주소변수 |
MIPS 프로세서에는 이 32개의 register을 저장하는 Register File이 있다. 그림을 자세히 보면, 2개의 Read Register number와 1개의 Write register number가 있다. 각 5비트로 구성되어 있는데 2^5 = 32 가 되며, 즉 5개의 비트로 어떤 Register에 값을 저장할지/입력할지 를 결정하는 것이다.
결국, 1Clock이 지나갈때 마다, 2개의 Regitser에서 값을 읽어올 수 있고, 1개의 Register에 값을 쓸 수 있다. 그리고 입력측 가장 마지막에는 Write data 32비트가 있는데, 이 32비트가 5비트로 지정한 Write Register에 저장되는 것이다.
이제 MIPS의 명령어 체계에 대해서 알아본다.
MIPS의 명령어는 위와 같이 명령어와 3개의 변수로 이루어진다. 위 명령어는 a에 b와 c를 더한 것을 저장하라는 의미이다. 이것은 앞서 이야기한 2개의 Register에서 값을 읽어오고, 1개의 Register에 값을 쓸 수 있다는 것과 동일한 의미이다.(a에는 Write, b와 c 에서 Read)
모든 명령어는 이렇게 이루어져 있다.
명령어 , write 할 register , read 할 register1 , read 할 register2
명령어는 Arithmetic, Data Transfer, Logical, Conditional Branch, Unconditional jump 로 구성되어 있다. data sheet를 확인해보면 어떻게 쓰는지는 다 확인이 가능하므로, 여기서는 간략하게만 소개하고 넘어간다.
1. Arithmetic (산술계산)
덧셈, 뺄셈을 지원한다. 명령어로는 add, sub, addi 가 있으며 add는 덧셈, sub는 뺄셈, addi는 상수를 더한다.
2. Data Transfer(데이터 전송)
lw, sw, lh, lhu, sh, lb, lbu, sb, ll, sc,lui 11가지 명령어가 있으며
word(32bit) 단위 명령어와 byte(8bit) 단위 명령어로 나뉜다.
lw는 메모리로부터 register에 값을 word(전체) 저장
store는 register로부터 메모리에 값을 저장
lh는 메모리로부터 half word(16비트만)만 register에 저장
lhu는 lh와 동일하나, zero extension을 활용하여 저장
마지막으로 sh는 register로부터 메모리에 16비트만 저장을 의미한다.
다음은 byte(bit) 단위 명령어, byte는 8bit에 해당한다.
lb는 메모리로부터 register에 해당하는 위치에서 byte 만큼을 sign-extended하여 저장
lbu는 메모리로부터 register에 해당하는 위치에서 byte 만큼을 zero-extended하여 저장
sb는 register로부터 메모리의 지정된 위치에 byte만큼을 저장
ll과 sc은 atomic 연산을 가능하게 하는데, 실제로 써본적이 없어서 chat gpt에게 작동방식을 물어보았다.
lui의 경우 16bit만큼 자리를 이동시키는 명령어가 되겠다.
다음글에서 계속..
#5. Procedure Calling(1)(함수 호출, Leaf Procedure인 경우) (1) | 2023.12.20 |
---|---|
#4. MIPS R, I, J-format Instructions, 명령어 포맷 (1) | 2023.12.17 |
#3. Big Endian, Little Endian (0) | 2023.12.14 |
#1. CPU time 과 CPI에 대해서, CPU의 성능측정 척도 (0) | 2023.11.16 |