가상의 컴퓨터를 디자인하면서 생각
CPU 디자인: H/W 전문가(로직), ASIC 전문가, Algorithm 전문가, Interface 전문가, 프로그램 전문가(레지스터, 명령어 디자인), ...
프로그래머 관점
CPU의 레지스터만을 디자인 대상으로 삼는다고 가정하다
레지스터 디자인의 핵심
레지스터는 몇 비트로 구성할 것인가? - 32비트, 64비트
몇 개 정도로 레지스터를 구성할 것인가?
레지스터 각각을 무슨 용도로 사용할 것인가?
ex) 16비트를 갖는 8개의 레지스터의 용도 예시
r0: 범용 레지스터
r1: 범용 레지스터
r2: 범용 레지스터
r3: 범용 레지스터
r4: ir(instruction register)
r5: sp(stack pointer)
r6: ir(link register)
r7: pc(program counter)
→ 레지스터를 디자인 했다면, 이제 CPU에게 일을 시키기 위한 명령어 구조 및 명령어 종류를 디자인해야 함
레지스터와 명령어의 상관관계: 레지스터 구성형태에 따라서 명령어의 구조가 달라진다.
가상 16비트 레지스터 디자인하도록 설정
명령어의 기본 모델
16비트 명령어의 활용방안
사칙연산 명령어 구성 (사칙연산)
연산의 의미 | 심볼 | 2진코드
덧셈 | ADD | 001
뺄셈 | SUB | 010
곱셈 | MUL | 011
나눗셈 | DIV | 100
명령어 구조를 단순화해야 하는 이유
F D E
F D E
F D E
명령어의 제한 (RISC의 특징)
사칙연산의 피연산자는 숫자 or 레지스터
연산결과는 레지스터에 저장
레지스터를 통해서 모든 연산을 진행하겠다.
→ 즉, 메인 메모리 주소 정보를 사칙연산의 피연산자로 올 수 있도록 명령어 구조를 설계하지 않고
→ 위와 같은 명령어의 제한이 있기 때문에, LOAD와 STORE 명령어가 필요하다.
→ 따라서, 메인 메모리에 저장된 데이터를 레지스터로 일단 옮기고 연산을 진행해야 하는데 이를 위해 레지스터와 메인 메모리 사이에서 데이터를 전송할 수 있는 명령어가 필요함
RAM (Main Memory) Register
int a=10: 0x10번지에 할당 ---LOAD-->
int b=20: 0x20번지에 할당 <--STORE-- (예약, 2비트) (ADD, 3비트) (c, 3비트) (a, 4비트) (b, 4비트)
int c=0: 0x30번지에 할당
c = a + b
Load 명령어 (메인 메모리 → 레지스터)
Store 명령어 (레지스터 → 메인 메모리)
문제 해결
1. 명령어 (LOAD r1 0x10)
메인 메모리 주소 0x10에 위치한 a=10이라는 데이터 정보를 레지스터 r1에 저장
2. 명령어 (LOAD r2 0x20)
메인 메모리 주소 0x20에 위치한 b=20이라는 데이터 정보를 레지스터 r2에 저장
3. 명령어 (ADD r3 r1 r2)
레지스터 r1에 저장된 a=10과 레지스터 r2에 저장된 b=10의 데이터 정보를 ADD 연산으로 더한
c 값인 c=30을 레지스터 r3에 할당
4. 명령어 (STORE r3 0x30)
레지스터 r3에 할당된 c=30을 메인 메모리 주소 0x30에 저장
문제
Ram(Main Memory)
int a = 10; 0x0010번지에 할당
int b = 20; 0x0100번지에 할당
int c = 0; 0x0020번지에 할당
c = a + b
- c = a + b 연산을 수행하기 위해서,
a와 b의 값이 할당된 메모리 주소 값을 통해 메모리 값을 레지스터에 할당하여 연산을 진행해야 함.
- 하지만 이때 b의 값이 할당된 메모리 주소 값을 우리가 디지안한 모든 명령어로는 16진수의 0x100을
표현할 방법이 없다.
1. 명령어 (LOAD r1 0x0010)
메인 메모리 값 0x0010에 할당된 a=10이라는 데이터 정보를 레지스터 r1에 저장
2. 명령어 (MUL r0 4 4)
4x4=16이라는 값을 레지스터 r1에 저장
2. 명령어 (MUL r2 4 4)
4x4=16이라는 값을 레지스터 r2에 저장
3. 명령어 (MUL r3 r0 r2)
r0에 저장된 16과 r2에 저장된 16을 곱하여 256이라는 값을 레지스터 r3에 저장
256이라는 숫자는 16진수로 100이라는 숫자를 표현한다.
따라서 우리는 명령어 상으로 0x0100이라는 숫자를 표현하지 못하지만,
위의 연산 결과를 통해서 r3라는 레지스터에 0x0100을 저장할 수 있다.
4. 명령어 (SOTRE r3 0x0030)
16진수 0x0030이라는 메인 메모리의 주소 값에 r3 레지스터에 저장된 0x0100이라는
16진수를 저장한다.
5. 명령어 (LOAD r2 [0x0030])
[0x0030]은 메인 메모리 0x0030번지에 저장된 메모리 주소 값을 참조하여,
그 메모리 주소 값에 할당된 메모리 값 즉 b=20을 레지스터 r2에 저장하겠다는 의미 (indirect mode)
6. 명령어 (ADD r3 r1 r2)
레지스터 r3에 레지스터 r1에 할당된 a=10과 레지스터 r2에 할당된 b=20이라는 값을 ADD 명령어를 수행한
30이라는 값을 할당한다.
Reference