본문 바로가기

System/컴퓨터구조

컴퓨터구조2

  • 컴퓨터 구조의 접근방법

레지스터를 디자인하자

 

레지스터를 디자인의 핵심

1. 레지스터를 몇 비트로 구성할 것인가?

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

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

 

각각 특정 용도를 정하면 명령어가 단순해지고 속도가 빨라진다.

 

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

 

  • 저장소 : 레지스터
  • 피연산자1, 2 : 레지스터 or 숫자  

명령어에 따라 조합이 달라짐

"레지스터 r1에 있는 값과 숫자 7을 더해서 레지스터 r2에 저장하라"는 의미

 

다음과 같이 구성하기로 한다.

 

연산 대상이 되는 피연산자는 숫자가 될 수도 있고, 레지스터가 될 수도 있다.

 

  • r2 = r1 + r3 -> 레지스터 r1와 r3에 있는 값을 더해서 r2에 저장하라
  • r2 = r1 + 4  -> 레지스터 r1에 저장된 값과 숫자 4를 더해서 r2에 저장하라

저장된 데이터가 숫자를  표현하는 것인지, 레지스터 정보를 표현하는 것인지 구분할 수 있어야 한다.

예를들어 0001이 들어있을 때 이것이 레지스터 r1을 의미하는지, 숫자 1을 의미하는지 알 수 없다.

 

컨트롤 유닛은 명령어를 해석하는 일을 맡고 있다. 따라서 명령어 구성 및 해석방법을 정확히 알고 있어야 해석이 가능

(= 명령어의 형태에 따라서 컨트롤 유닛의 논리회로가 디자인된다는 뜻)

 

명령어를 구성하는 과정에서 몇몇 제약사항들이 있는데 연산결과를 레지스터에만 저장하도록 제한되어 있다는 점이다.

이런 제약사항들은 CPU의 종합적 측면(성능, 비용 등등)이 고려되는 가운데서 등장했다.

 

RISC vs CISC

 

CISC

 

- 명령어 수가 많고, 그 크기가 일정치 않기 때문에 복잡하다.

- 복잡한 구조는 성능 향상에 제한이 있다. 

 

RISC

 

- 명령어 수를 대폭 줄임

- 암배다두 환경에서 사용되는 대부분의 CPU가 RISC구조

- 명령어 길이가 동일하고 명령어를 처리하는 과정이 일정하기 때문에 클럭당 둘 이상의 명령어 처리가 가능

 

  • LOAD & STORE 명령어 디자인

LOAD & STORE 명령어의 필요성

 

int a = 10;  // 0x10번지 할당

int b = 20;  // 0x20번지 할당

int c = 0;    // 0x30번지 할당

c = a + b;

 

- 메인 메모리 주소 정보를 사칙연산의 피연산자로 올 수 있도록 명령어 구조를 설계하지 않았기 때문에 위와 같은 명령어는 만들지 못한다(범용적으로 사용되는 RISC의 특징)

- 메인 메모리에 저장된 데이터를 레지스터로 일단 옮겨다 놓은 다음에, 덧셈을 진행해야 한다.

 

명령어 제한

  • 사칙연산의 피연산자는 숫자 or 레지스터
  • 연산결과는 레지스터에 저장
  • 즉 레지스터를 통해 모든 연산을 진행

 

메인 메모리에 저장된 데이터를 레지스터로 이동시키기 위한 LOAD 명령어와, 레지스터에 저장된 데이터를 메인 메모리로 이동시키기 위한 STORE 명령어가 필요하다.

 

LOAD & STORE 명령어의 디자인

 

명령어 LOAD의 포맷

"0x20번지에 존재하는 데이터를 레지스터 r1에 저장하라"

 

명령어 LOAD의 포맷

"레지스터 r1에 존재하는 데이터를 메인 메모리 0x20번지에 저장하라"

 

LOAD r1, 0x10  // 0x10번지에 저장된 데이터를 r1로 이동

LOAD r2, 0x20  // 0x20번지에 저장된 데이터를 r2로 이동

ADD r3, r1, r2   // r1, r2에 저장된 값을 더해서 r3에 결과 저장

STORE r3, 0x30 // r3에 저장된 값을 0x30번지에 저장

  • Direct Addressing 모드와 Indirect Addressing 모드

Direct 모드의 문제점과 Indirect 모드의 제안

 

Direct 모드는 명령을 수행하는데 필요한 데이터의 위치를 직접적으로 가리킨다. 이는 명령어 형식이 간단하다는 장점이 있으나, 비트 수에 비해 주소 표현 범위가 제한된다.

 

 

Indirect 모드의 이해

 

0x10번지에 저장된 값을 주소값으로 참조해서 값을 읽는다.

Direct Addressing Mode

 

 

Indirect Addressing Mode

 

Indirect 모드 활용 예제

 

순서

1. 0x0010(a)번지와 0x0100(b)번지에 저장되어 있는 값을 각각 레지스터 r1, r2로 이동한다.

2. 레지스터 r1과 r2에 있는 값을 더해서 레지스터 r3에 저장한다.

3. 레지스터 r3에 저장된 값을 0x0020(c)번지에 저장한다.

 

첫 번째 연산을 위해선 아래와 같은 명령어가 필요

LOAD r1, 0x0010  // 0x0010번지에 저장된 데이터를 r1로 이동

LOAD r2, 0x0100  // 0x0100번지에 저장된 데이터를 r2로 이동

 

문제점

 0x0010번지에 저장된 데이터를 r1으로 이동시키는 첫 번째 명령어는 문제될 것이 없으나, 문제는 0x0100번지에 저장된 데이터를 r2로 이동시키는 두 번째 명령어에 있다. 

 LOAD 명령어를 디자인할 때 source 표현을 위해 8비트를 할당했다.(8비트로 표현할 수 있는 범위는 0x00 ~ 0xff)

 

해결방법

 두 번째 명령어(LOAD r2, 0x0100)를 대신할 명령어를 조합해야하는데 0x0100은 십진수로 256이므로 이 숫자를 만들어야 한다

 

MUL r0, 4, 4   // r1에는 데이터 0x0010이 저장되어 있으므로 r0에 연산결과 저장

MUL r2, 4, 4

MUL r3, r0, r2

 

 r0에 MUL명령어를 사용해서 만들어낸 값 16을 저장하고, r2에도 마찬가지로 16을 만들어서 저장한다. 그 후 이 두 레지스터에 저장된 값을 곱해서 얻은 값 256을 r3에 저장한다.

 

STORE r3, 0x0030    // 레지스터 r3에 저장된 주소 데이터를 다시 메인 메모리로 옮겨다 놓는다.

 

메인 메모리를 Indirect 모드로 참조해 값을 읽어오도록 LOAD 명령어를 구성한다.

LOAD r2, [0x0030]   // 0x0100번지에 저장된 데이터를 레지스터에 저장

 

c = a + b 명령어 조합을 정리하면

 

LOAD r1, 0x0010

 

MUL r0, 4, 4

MUL r2, 4, 4

MUL r3, r0, r2

 

STORE r3, 0x0030

LOAD r2, [0x0030]

 

ADD r3, r1, r2

'System > 컴퓨터구조' 카테고리의 다른 글

컴퓨터구조1  (0) 2019.05.31