CPU의 작동원리2️⃣ - 레지스터
프로그램 속 명령어와 데이터는 실행 전후로 반드시 레지스터에 저장된다.
CPU마다 레지스터의 이름, 크기, 종류가 매우 다양하다. 대표적인 레지스터 8가지에 대해 정리하자.
- 프로그램 카운터
- 명령어 레지스터
- 메모리 주소 레지스터
- 메모리 버퍼 레지스터
- 플래그 레지스터
- 범용 레지스터
- 스택 포인터
- 베이스 레지스터
우선 7번과 8번은 주소 지정 방식에 사용되는 레지스터이다. 1번부터 정리해보자.
프로그램 카운터는 메모리에서 읽어 들일 명령어의 주소를 저장한다. 명령어 포인터라고 부르는 CPU도 있다.
명령어 레지스터는 방금 메모리에서 읽어 들인 명령어를 저장한다. 제어장치가 이 명령어 레지스터에 저장된 명령어를 해석하고 제어신호를 보낸다.
메모리 주소 레지스터는 메모리의 주소를 저장하는 레지스터이다. CPU가 읽고 싶은 명령어의 주소값을 주소버스를 통해 보낼 때 메모리 주소 레지스터를 거치게 된다.
메모리 버퍼 레지스터는 메모리에 쓰고 싶은 값이나 메모리로부터 전달받은 값이 거치게 된다.
CPU가 주소버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고 받을 값은 메모리 버퍼 레지스터를 거친다.
레지스터들이 작동하는 과정을 그림으로 정리한다.
우선 CPU로 실행할 프로그램이 다음과 같이 메모리에 저장되어 있다.

프로그램을 처음부터 실행하기 위해 프로그램 카운터에는 1000이 저장된다. 메모리에 가져올 명령어가 1000번지에 있다는 것이다.

1000번지에 있는 데이터를 읽기 위해서 주소 버스로 1000번지를 내보내야한다. 이를 위해 메모리 주소 레지스터에 1000이 저장된다.

메모리 읽기 제어 신호와 메모리 주소가 각각 제어버스와 주소버스를 통해 메모리에 전달된다.

메모리 1000번지에 저장된 값은 데이터 버스를 통해 CPU로 전달되고 데이터 버퍼 레지스터에 그 값이 전달된다.
그리고 프로그램 카운터가 증가되어 다음 명령어를 읽어 들일 준비를 한다.

메모리 버퍼 레지스터에 저장된 값은 명령어 레지스터로 이동한다.

그리고 제어장치는 명령어 레지스터의 명령어를 해석하고 제어신호를 발생시킨다.
그러면 다시 범용 레지스터부터 정리해보자.
메모리 주소 레지스터는 주소만 저장되고 메모리 버퍼 레지스터는 데이터만 저장된다.
범용 레지스터는 모두 저장할 수 있는 레지스터이다.
플래그 레지스터는 연산결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터이다.
특정 레지스터를 이용한 주소 지정 방식
앞서 말한 것처럼 스택 포인터와 베이스 레지스터는 주소 지정 방식에 사용되는 레지스터들이다.
스택 포인터는 스택 주소 지정 방식에 사용되는 레지스터이다. 스택 포인터는 스택의 top을 가리키고 있다. 즉, 스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터이다.
베이스 레지스터는 변위 주소 지정 방식에 사용되는 레지스터이다.
변위 주소 지정 방식은 오퍼랜드 필드의 값과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식이다.

오퍼랜드 필드의 주소와 어떤 레지스터의 값이랑 더하는지에 따라 상대 주소 지정 방식과 베이스 레지스터 주소 지정 방식이 있다.
상대 주소 지정 방식은 프로그램 카운터의 값을 더하여 유효 주소를 얻어내는 방식이다.
베이스 레지스터 주소 지정 방식은 베이스 레지스터의 값을 더하여 유효 주소를 얻어내는 방식이다.
여기서 베이스 레지스터는 기준 주소, 오퍼랜드는 기준 주소로부터 떨어진 거리로서의 역할을 한다.
즉, 베이스 레지스터 주소 지정 방식은 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산하여 유효 주소를 얻어내는 방식이다.
