MIPS Memory Structure
MIPS 메모리 구조
- 사각형의 크기는 곧 메모리의 크기이다.
- 레지스터는 비싼 CPU 실리콘 면적을 차지하는 만큼 가격이 비싸다.
- Storage 레벨로 갈 수록, 생산에 필요한 자재의 가격이 비싸지 않고, CPU와의 물리적 거리에 제한이 적은만큼 가격이 저렴하다.
Memory Unit (메모리 단위)
- 하나의 레지스터의 크기는 1 Word이다.
(Word는 컴퓨터 아키텍처 설계 시, 컴퓨터가 한 번 처리하는 데이터의 비트 길이를 의미하며, MIPS에서는 그것을 32bit로 정의한 것이다.)
- CPU 내부에는 32 Word 크기의 레지스터가 존재한다. (32개의 레지스터)
- x86에서는 예외적으로 1Word를 16bit로 정의했는데, 이는 구 버전 시스템과의 Backward Compatibility(하위 호환성)를 위한 것이다.
Register (레지스터)
- 레지스터는 메모리의 크기는 작지만 처리속도는 여타 메모리 중 가장 빠른 저장공간이다.
- 레지스터는 CPU 내부에 위치하여 프로세서와의 물리적 거리를 빠른 처리속도를 낼 수 있다.
- 8개의 소자로 이루어진 S-RAM을 통해 생산된다.
(Flip-Flops을 통해 제작하는 것 또한 가능하지만, S램으로 제작시에 더 적은 면적에 많은 기억소자를 Integration(적재)할 수 있기 때문에, Intel과 같은 기업들에선 레지스터를 S램으로 제작하고 있는 추세이다.)
(컴퓨터 구조 강의에서는 레지스터가 Flip-Flops로 제작된다고 가정한다!)
- 32bit로 구성된 32개의 Register가 MIPS 프로세서 내부에 저장되어 있다.
(레지스터의 개수가 32개에 그친 것 또한, MIPS의 설계 철학 중 Smaller is faster에 부합되는 부분이다.)
- MIPS Instruction에서 레지스터 번호는 Symbol "$"을 통해 표현한다.
ex) \(\texttt{\$0}\) : 첫 번째 레지스터, \(\texttt{\$31}\) : 마지막 레지스터 (32번 째)
Ex. 레지스터를 이용한 산술연산 예시
- ALU는 \(\texttt{\$1}\), \(\texttt{\$5}\)를 더한 값을 \(\texttt{\$3}\)에 저장한다.
Register File Interface (레지스터 파일 인터페이스)
- 1 Register File = 32 Registers (MIPS에는 하나의 레지스터 파일이 내장되어 있다.)
- 레지스터 파일에서는 두 Source를 동시에 Read할 수 있고, 하나의 Destination에 데이터를 Write할 수도 있다.
- 32개의 레지스터를 구분(지칭)하기 위해, 5bit의 레지스터 주소 체계를 이용한다. (\(2^5 = 32\))
- Write Control Bit : 이 값이 True일 경우 해당 연산은 Write 연산을 수행한다는 것을 알린다. Read와 달리, Write 연산은 레지스터의 내용에 변화가 생기기 때문에 안전상의 이유로 Write Control Bit를 사용한다.
Register Name & Usage(레지스터의 이름과 사용 관례)
- Naming Convention : 표의 첫 번째 칼럼처럼, 레지스터의 이름을 사용한 표기법이다.
- Numbering Convention : 표의 두 번째 칼럼처럼, 레지스터의 번호를 사용한 표기법이다.
- 대부분의 컴파일러/어셈블러에서는 네이밍 표기, 넘버링 표기 둘 다 지원하고 있다.
\(\texttt{\$zero}\) Register : (\(\texttt{\$0}\))
- 32bit 모두 0값을 저장하고 있는 Hardwired 레지스터이다.
- Read-only 구조이며, Write 작업을 수행할 수 없다.
- 0값을 활용하는 합성 명령어 구현에 주로 이용된다.
add $t2, $s1, $zero # $t2 ← $s1 (mov 명령)
addi $t2, $zero, 10 # $t2 ← 10 (상수 초기화)
\(\texttt{\$t}\) Register : (\(\texttt{$8 - $15, $24 - $25}\))
- \(\texttt{t}\)는 temporary를 의미하며, 프로그래머가 의도하지 않은 임시 데이터를 저장하는 레지스터이다.
ex) \(\texttt{a = (b + c) * (e + f)}\) 에서, \(\texttt{b + c}\)나 \(\texttt{e + f}\)와 같은 중간 계산값들을 \(\texttt{\$t}\) 레지스터에 저장하게 된다.
\(\texttt{\$s}\) Register : (\(\texttt{$16 - $23}\))
- \(\texttt{s}\)는 saved temporary를 의미하며, 프로그래머가 의도한 데이터를 저장하는 레지스터이다.
ex) 보통, 고급언어에서 프로그래머가 선언한 변수 따위가 \(\texttt{\$s}\) 레지스터에 저장된다.
<!-- s Register와 t Register의 활용 -->
High-Level Code:
f = (g + h) - (i + j); // f부터 j는 각각 $s0부터 $s4에 저장되어 있다 가정하자.
MIPS Code:
add $t0, $s1, $s2 # $t0 : (g + h)
add $t1, $s3, $s4 # $t1 : (i + j)
sub $s0, $t0, $t1
이미지 출처: Computer Organization And Design 5th Edition (David A. Patterson), 권건우 교수님 강의록