가상으로 컴퓨터를 디자인

 

프로그래머 관점

  • 컴퓨터 구조를 잘 아는 프로그래머도 컴퓨터 디자인에 참여
  • 컴퓨터 디자인은 레지스터와 명령어 디자인

 

레지스터 디자인의 핵심

  • 레지스터는 몇 비트로 구성할 것인가?

n비트 시스템이 있을 때 레지스터도 n비트여야 한다.

명령어의 길이가 n비트 이기 때문에 하나의 명령어를 레지스터에 저장하기 위해 레지스터는 n비트여야 한다.

 

  • 몇 개 정도로 레지스터를 구성할 것인가?

레지스터에 수는 많으면 많을수록 좋다.

 

  • 레지스터 각각을 무슨 용도로 사용할 것인가?

RAM or H/D 는 일반적인 저장 장치인 반면 레지스터는 용도가 정해저 있는 저장 장치

레지스터의 용도를 정하면 명령어가 단순해지고, 속도가 빨라진다.

r1부터 r3까지는 범용 레지스터, r4부터 r7까지는 특별한 레지스터로 정함.

 

레지스터

ir : instruction register (인스트럭션 레지스터)

sp : stack pointer (스택 포인터)

lr : link register (링크 레지스터)

pc : program counter (프로그램 카운터)

 

몇 비트로 구성 : 16비트

레지스터 갯수 : 8개

 

 

명령어 구조 및 명령어 디자인

 

 

하나의 명령어를 실행하는 과정.

클럭수가 많으면 열이 많이 발생함.

 

(Reduced instruction set computer)

RISC(리스크) CPU <- 고성능

F(패치) -> D(디코드) -> E(익스큐션)

하나의 명령어당 한 클럭식 쓴다. 명령어 1번 당 총 3 클럭

즉 명령어 5개를 쓸 때 5 * 3 = 15 클럭이 필요하다.

 

 

 

 

 F

 

 D

 E

 

 

 

 

 

 F

 D

 E

 

 

 

 

 

 F

 D

 E

 

 

 

 

 

 F

 D

 E

 

 

 

 

 

 F

 D 

 E

n 명령어를 실행할 때 n + 2 클럭이 필요하다.

 

 

 

성능을 위해 리스크는 제약사항이 많다.

 

(Complex Instruction Set Computer)

CISC(시스크) CPU <- 저성능

복잡한 명령어로 구성된다.

 

LOAD & STORE 명령어 디자인

메모리에서 값을 연산하기 위해 CPU로 불러오는 명령어를 LOAD로 정의

연산 결과를 메모리에 다시 돌려보내는 연산을 STORE로 정의

 

명령어의 제한

사칙연산의 피 연산자는 숫자 or 레지스터

연산 결과는 레지스터에 저장

즉 레지스터를 통해서 모든 연산을 진행하겠다.

 

 

LOAD r1, 0x20 = 0x20에 있는 값을 r1에 불러와라.

 

STORE r1 0x20 = r1에 있는 값을 0x20에 넣어라.

 

1
2
3
4
5
6
7
8
9
int a = 10;        // 0x10번지 할당
int b = 20;        // 0x20번지 할당
int c = 0;        // 0x30번지 할당
= a + b;
 
LOAD r1, 0x10
LOAD r2, 0x20
ADD r3, r1, r2
STORE r3, 0x30
cs

 

 

Direct 모드와 Indirect 모드

  • Direct 모드
메모리에 주소값을 직접 지정해서 가저온다.
일반적인 메모리 참조방법.
LOAD r1, 0x10 실행시 : 메모리 0x10번지에 값을 r1에 넣는다.
 

Direct 모드의 문제점

1
2
3
4
5
6
7
int a = 10;        // 0x0010번지 할당
int b = 20;        // 0x0100번지 할당
int c = 0;          // 0x0020번지 할당
= a + b;
 
LOAD r1, 0x0010
LOAD r2, 0x0100
cs
8비트로 16진수로 100번지를 표현할 수 없음.
 
16  / 10  /    2
100 = 256 = 100000000
  • Indirect모드

메모리에 값을 참조해서 그 주소를 다시 한번 이동한 후 값을 가져온다.

메모리를 참조하고 그 값을 한번 더 참조함.(한 다리 거침)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int a = 10;        // 0x0010번지 할당
int b = 20;        // 0x0100번지 할당
int c = 0;         // 0x0030번지 할당
= a + b;
 
LOAD r1, 0x0010
LOAD r1, 0x0010
 
MUL r0, 44
MUL r2, 44
MUL r3, r0, r2
 
STORE r3, 0x0030
LOAD r2, [0x0030]
 
ADD r3, r1, r2
STORE r3, 0x0030
cs
 

MUL 곱하기 4 * 4를 r0에 저장

MUL 곱하기 4 * 4를 r2에 저장

MUL 곱하기 r3에 r0 * r2를 하면 16진수로 100번지가 됨.

 

표현하지 못하는 건 이런 식으로 만들어야 함.

 

STORE r3, 0x0030에 r3에 값을 0x0030번지에 넣어라

 

LOAD r2, [0x0030] = 인다이렉트 모드 0x0030에 담겨진 주소를 찾아가 r2에 넣겠다.

 

0x0030주소에는 0x0100이 들어있음.

 

ADD r3, r1, r2  =  r3에 r1 + r2를 해서 넣어라.

 

STORE r3, 0x0030 = 0x0030(c)에 r3에 값을 넣어라

 

최종적으로 c에 30이 들어감.

 

 

 

 

 

 

반응형