관리 메뉴

개발자비행일지

Direct 모드와 Indirect 모드 본문

▶ Computer Science

Direct 모드와 Indirect 모드

Cyber0946 2020. 12. 1. 16:12

Direct 모드와 Indirect 모드

Direct 모드의 문제점

하나의 명령어에 여러 정보를 담다 보니 표현하는 데이터 크기가 제한된다는 문제가 발생했다. 예를 들어 LOAD 명령어를 보면, 세 개의 비트수로 표현되는 destination 부분은 문제 될 것이 없다. 이 곳에는 데이터를 저장할 레지스터 정보가 오게 되는데, 레지스터 개수가 총 8개에 지나지 않기 때문이다.

하지만 메인 메모리의 주소값을 나타내는 source 부분에서는 문제가 발생한다. 이 부분에 총 여덟 개의 비트 수가 할당되어서, 표현할 수 있는 값의 범위가 0x0000에서부터 0x00ff까지가 전부이기 때문이다. 만약에 범위밖에 있는 0x0100번지에 저장되어 있는 데이터를 참조하고자 한다면 문제가 발생한다.

지금까지 우리가 언급한 메모리 접근방법을 가리켜 Direct 모드라 하는데, 이 방법을 통해서는 메모리의 모든 영역에 대한 접근이 불가능하다. 왜냐하면 Direct 모드로 메모리를 접근할 경우, 할당된 비트 수 안에서 표현 가능한 범위의 메모리 영역만 접근이 가능하기 때문이다.

Indirect 모드

Indirect 모드의 등장은 메모리 접근방법에 다양성을 부여한다. 그럼 이제 Indirect 모드가 무엇인지 이야기해 보자. 쉬운 예를 통해서 개념적 이해를 먼저 하자. 동생에게 ‘놀라운 새우깡’을 사오라고 부탁하고 싶다. 그런데 나는 이 제품이 바로 집 앞에 있는 ‘멋있는 슈퍼마켓’에서 판매하고 있음을 알고 있다. 그래서 동생에게 직접적으로 다음과 같은 부탁을 하였다.

 

 

다음과 같은 상황도 존재할 수 있다. ‘놀라운 새우깡’ 하나 사다 줄 것을 동생에게 부탁하고 싶다. 그런데 나와 동생은 이 제품이 어느 슈퍼마켓에 있는지 모른다. 그러나 건너 방에 있는 큰 형은 이것을 지난 번에 구입했었다. 그래서 동셍에게 다음과 같이 부탁하였다.

 

 

첫 번째 상황은 Direct 모드에 해당되고, 두 번째 상황은 Indirect 모드에 해당된다.

 

마찬가지다. 앞에서의 LOAD 명령어에서는 레지스터에 저장할 데이터가 존재하는 주소를 직접적으로 표현하였는데, 반대로 Indirect 모드라 한다면 명령어에서 지정하는 번지에 저장된 값을 주소값으로 참조하게 된다.

 

 

다음 그림은 LOAD 명령어의 Indirect 모드를 설명하고 있다. [그림 4-15]와 비교해 보면, 명령어에서 표현하고 있는 0x10번지에서 값을 읽어오는 것이 아니라, 0x10번지에 저장된 값을 주소값으로 참조해서 값을 읽어오고 있다. 이것이 Indirect 모드 메모리 참조방식이다.

 

 

그렇다면 Indirect 모드 명령어를 바이너리 코드로 어떻게 표현하면 좋겠는가?

 

 

Indirect 모드 연산과 Direct 모드 연산을 구분 지으려면 이를 표시하기 위해 추가 비트가 필요하다. 그런데 앞서 우리는 첫 두 비트의 용도를 결정하지 않았으므로, 이 영역을 활용하면 되겠다. 마지막은 여러분이 스스로 결정하기 바란다. 11로 Indirect 모드 연산을 표현할 것인지, 아니면 01로 Indirect 모드 연산을 표현할 것인지 여러분이 결정하기 바란다.

 

STORE 명령어에도 Indirect 모드는 동일하게 적용된다.


 

[Indirect 모드 활용 예제]

 

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로 이동

 

문제는 0x0100번지에 저장된 데이터를 r2로 이동시키는 두 번째 명령어에 있다. 우리는 이 명령어를 만들 수 없기 때문이다.

 

이 문제는 Indirect 모드를 도입하면 해결 가능하다.

 

0x0100은 십진수로 256이니 이 숫자를 만들어 내는 것이 가장 우선이다.

 

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

MUL r2, 4, 4

MUL r3, r0, r2

 

사칙연산 명령어 구조를 보면 피연산자로 상수가 올 때 나타낼 수 있는 값의 범위가 0에서부터 7까지다. 따라서 이 숫자를 가지고 0x0100(256)을 조합해 내야만 한다.

 

일단 r0에 MUL 명령어를 사용해 만들어낸 값 16을 저장하고, r2에도 마찬가지로 16을 만들어서 저장한다. 그리고 마지막에 이 두 레지스터에 저장된 값을 곱해서 그 결과(물론 256이 된다)를 r3에 저장한다.

 

c = a + b에 해당하는 명령어 조합을 정리하면 다음과 같다.

 

LOAD r1, 0x0010

 

MUL r0, 4, 4

MUL r2, 4, 4

MUL r3, r0, r2

 

STORE r3, 0x0030 //r3의 값을 0x0030번지에 저장한다.

LOAD r2, [0x0030] //[0x0030]번지에 있는 값을 주소로 참조하여 r2에 로드한다.

 

ADD r3, r1, r2

요약정리

1. 명령어
CPU의 디자인 과정에서 CPU에게 일을 시키기 위한 명령어가 만들어지는데, 이 명령어의 구성이 어떻게 되는지 살펴보았다. 연산자에 대한 정보뿐만 아니라, 피 연산자에 대한 정보도 함께 들어감을 기억하자. 그리고 명령어의 종류에 따라서 정보를 담고 있는 방식도 다름을 기억하자.

2. CPU의 내부 연산과 레지스터
이번 장에서는 레지스터의 필요성을 특히 강조에서 설명하였다. 이후에도 필요한 내용이므로 덧셈 연산이 이뤄지는 과정을 레지스터와 관련해서 이해하도록 하자.

3. Direct vs Indirect
메모리에 접근하는 방식은 크게 두 가지로 direct 모드와 indirect 모드가 있다. direct 모드는 명령어에서 지정하는 위치의 메모리를 참조하는 방식이고, indirect 모드는 명령어에서 지정하는 위치에 저장된 값을 주소값으로 하여 메모리를 참조하는 방식이다. indirect 모드는 direct 모드가 지니는 한계를 극복하는 데 도움을 준다.

 

'▶ Computer Science' 카테고리의 다른 글

Surrogate Model  (0) 2020.12.22
Out-of-order Processor Pipeline 이란  (0) 2020.12.02
파이프라이닝(Pipelining)  (0) 2020.12.01
신호  (0) 2020.11.15
DNSSEC(DNS Security Extensions)  (0) 2020.10.20