먼저 MIPS에 대한 간단한 설명을 하고 Instruction에 대해 설명하겠습니다
MIPS는 무엇인가?
MIPS는 RISC 계열의 명령어 집합 체계로, MIPS Technologies에서 개발되었습니다.
MIPS 명령어 체계는 깔끔하게 설계되어 있어서 많은 대학교에서 컴퓨터 아키텍처 과목에서 가르치고 있습니다. 이는 MIPS 명령어 체계가 RISC(Reduced Instruction Set Computing) 체계로 분류되기 때문입니다. RISC 체계는 명령어의 수를 줄이고, 명령어의 길이를 일정하게 유지하여 명령어 해석 및 실행 속도를 높이는 방식으로 설계되었습니다.
하지만 2021년에는 MIPS를 개발한 회사가 MIPS를 개발 중단하고, RISC-V로 이주를 발표했습니다. RISC-V는 MIPS와 같이 RISC 체계를 따르는 명령어 체계로, 오픈 소스로 개발되어 있어서 누구나 자유롭게 사용할 수 있습니다. 이러한 이유로 RISC-V는 최근에 많은 주목을 받고 있습니다.
MIPS의 역사
음 대충 역사를 정리해봤습니다. 이건 안읽어도 될것 같네요
1986년: MIPS Computer Systems에서 R2000 마이크로프로세서와 함께 MIPS I를 발표하여 RISC 기반의 명령어가 처음으로 적용된 CPU가 상용화됨.
1992년: 64비트 레지스터와 정수 연산이 지원되는 MIPS III 발표, 실리콘 그래픽스 인수.
2012년: 이미지네이션 테크놀로지에 인수.
2017년: Canyon Bridge Capital Partners에 인수.
2018년: 웨이브 컴퓨팅이 MIPS Technologies를 인수하여 자회사로 만듦.
2020년: 웨이브 컴퓨팅이 파산 보호 신청.
2021년: 파산 보호 상태에서 벗어난 웨이브 컴퓨팅이 MIPS 아키텍처 대신 RISC-V 아키텍처를 개발하기로 결정하며 MIPS 아키텍처 라이선스 사업은 계속됨.
임베디드 환경에서는 여전히 구형 MIPS 설계가 사용되고 있음.
중국의 Loongson이 MIPS ISA를 기반으로 CPU를 설계하고 제조함.
러시아의 Baikal도 MIPS 프로세서 제조사로 지원받음. MIPS P5600 설계를 사용하다가 Arm으로 전환하려고 함.
러시아의 반도체 독립 야망은 러시아-우크라이나 전쟁과 국제사회의 제재로 인해 저하됨.
MIPS 명령어 체계
MIPS 명령어 체계는 opcode라는 개념을 바탕으로 3가지 종류의 명령어로 구성되어 있습니다.
첫째, R type은 2개의 레지스터 값을 사용하여 연산을 한 다음, 다른 레지스터 하나에 연산 결과를 저장합니다.
둘째, I type은 R type과 비슷하지만, 하나의 레지스터와 하나의 immediate 값을 사용하여 연산을 합니다.
셋째, J type은 무조건 분기 명령어로, 특정 메모리 주소로 이동이 필요한 경우에 사용됩니다. MIPS 명령어 체계를 확장한
명령어 체계로는 MCU, SmartMIPS, MDMX, MIPS-3D, microMIPS, picoMIPS, MIPS16e 등이 있습니다. 이러한 명령어 체계는 MIPS 아키텍처를 사용하는 다양한 장치에서 사용됩니다.
산술연산 Arithmetic Operations
MIPS에서는 산술 연산을 위해 3개의 레지스터를 사용합니다.
이때, 두 개의 레지스터를 소스(source)로 사용하고, 연산 결과를 하나의 레지스터에 저장(save)하는 형태로 연산이 이루어집니다.
예를 들어, "add a, b, c" 명령어는 b와 c의 값을 더한 후, 그 결과를 a 레지스터에 저장하는 명령어입니다. 이러한 산술 연산은 모두 동일한 형태를 가지고 있으며, 이는 디자인 원칙 중 하나인 "단순성이 규칙성을 선호한다"는 원칙을 따릅니다. 즉, 규칙적인 구조를 가지도록 설계함으로써 구현이 간단해지며, 이는 더 높은 성능을 더 낮은 비용으로 도출할 수 있게 됩니다.
연산 예시
C 코드로 작성된 "f = (g + h) - (i + j)" 문장은 MIPS 명령어로 컴파일되어 실행됩니다.
이때, MIPS 명령어 체계에서는 먼저 "add to, g, h" 명령어를 실행하여 g와 h의 값을 더한 후, 그 결과를 to 레지스터에 저장합니다.
다음으로, "add t1, i, j" 명령어를 실행하여 i와 j의 값을 더한 후, 그 결과를 t1 레지스터에 저장합니다.
마지막으로, "sub f, to, t1" 명령어를 실행하여 to 레지스터와 t1 레지스터의 값을 뺀 후, 그 결과를 f 레지스터에 저장합니다.
맨 앞에 있는 변수에 뒤에 두 개의 결과 값을 입력한다고 생각하면 편하겠네요
Register Operands
MIPS 아키텍처에서는 32 x 32비트 레지스터 파일을 사용하며, 자주 액세스되는 데이터를 저장하기 위해 사용됩니다. 이 파일은 0에서 31까지의 번호가 매겨진 32개의 레지스터로 구성되어 있으며, 32비트 데이터는 "워드"라고 불립니다.
임시 값을 위해 $t0, $t1, ..., $t9와 같은 어셈블러 이름을, 그리고 저장된 변수를 위해 $s0, $s1, ..., $s7과 같은 다른 어셈블러 이름을 사용할 수 있습니다. 이를 통해 프로그래머는 레지스터를 사용하여 데이터를 빠르게 액세스할 수 있습니다. MIPS 아키텍처의 또 다른 특징은 "작을수록 빠르다"는 설계 원칙입니다.
이는 메인 메모리의 수백만 개의 위치와 비교되며, 레지스터는 데이터에 더 빠르게 액세스할 수 있도록 설계되어 있습니다.
Register Operands Example
C 코드에서 f, g, h, i, j는 각각 $s0, $s1, $s2, $s3, $s4 레지스터에 저장됩니다. 이 코드를 MIPS 코드로 컴파일하면, 각각의 연산자는 어셈블리 명령어로 대체됩니다. 예를 들어, "add $t0, $s1, $s2" 명령어는 $s1와 $s2를 더하고, 결과를 $t0 레지스터에 저장합니다. "sub $s0, $t0, $t1" 명령어는 $t0과 $t1 레지스터의 값을 뺀 후, 결과를 $s0 레지스터에 저장합니다.
이렇게 레지스터를 사용하여 연산을 수행하면, 메모리에서 데이터를 읽어오는 것보다 빠르게 연산을 수행할 수 있으므로, 프로그램의 실행 속도가 향상됩니다.
즉 실제로 register에서 사용할 때에는 fgh 같은 c코드에서 사용하는 변수를 사용하는 것이 아니라 $s0처럼 레지스터 주소에 저장됩니다.
결론
MIPS에 대한 간단한 이해가 되었을까요, 아직은 그렇게까지 어렵지 않아서 그렇구나 하면서 이해하면 될 것 같습니다.
찾아보면 MIPS code를 직접 해볼 수 있는 사이트가 있을 것입니다.
https://rivoire.cs.sonoma.edu/cs351/wemips/
WeMips: Online Mips Emulator
# Not sure what to do now? Enter your mips code here # and hit step (to run one line at a time) or # hit run (to run them all at once) # Keep an eye on the register and stack tracker # to see what changes are being made to them. # If you want to preload th
rivoire.cs.sonoma.edu
위 사이트에서 해봐도 되겠네요
다음 시간에는 memory operand에 대해 공부해보겠습니다.
'컴퓨터.반도체' 카테고리의 다른 글
컴퓨터 구조 1 - 보수를 이용한 계산과 MIPS basic (0) | 2023.05.21 |
---|---|
컴퓨터 구조 1 - Memory operands (0) | 2023.05.18 |
컴퓨터 구조 1 - Reducing Power (0) | 2023.05.16 |
컴퓨터 구조 1 - Instruction Count and CPI (0) | 2023.05.14 |
컴퓨터 구조 1 응답시간 및 처리량(Response Time and Throughput) (0) | 2023.05.11 |
댓글