레지스터의 종류와 역할을 알아보고,
각 레지스터를 통해 명령어가 처리되는 과정을 알아보자.
반드시 알아야 할 레지스터!
- 프로그램 카운터
- 명령어 레지스터
- 메모리 주소 레지스터
- 메모리 버퍼 레지스터
- 플래그 레지스터
- 범용 레지스터
- 스택 포인터
- 베이스 레지스터
프로그램 카운터
- 프로그램 카운터는 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장한다.
- 프로그램 카운터를 명령어 포인터라고 부르는 CPU도 있다.
명령어 레지스터
- 명령어 레지스터는 해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터이다.
- 제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤, 제어신호를 내보낸다.
메모리 주소 레지스터
- 메모리 주소 레지스터는 메모리의 주소를 저장하는 레지스터이다.
- CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 주소 레지스터를 거치게 된다.
메모리 버퍼 레지스터
- 메모리 버퍼 레지스터는 메모리와 주고받을 값(데이터와 명령어)을 저장하는 레지스터이다.
- 메모리에 쓰고 싶은 값이나 메모리부터 전달받은 값은 메모리 버퍼 레지스터를 거친다.
- CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고받을 값은 메모리 버퍼 레지스터를 거친다.
- 메모리 버퍼 레지스터는 메모리 데이터 레지스터(MDR)라고 부른다.
범용 레지스터
- 범용 레지스터는 이름 그대로 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터이다.
- 범용 레지스터는 데이터와 주소를 모두 저장할 수 있다.
- 일반적으로 CPU 안에는 여러 개의 범용 레지스터들이 있고, 현대 대다수 CPU는 모두 범용 레지스터를 가지고 있다.
플래그 레지스터
- ALU 연산 결과에 따른 플래그를 플래그 레지스터에 저장한다.
- 플래그 레지스터는 연산 결과 또는 CPU 상태에 부가적인 정보를 저장하는 레지스터이다.
특정 레지스터를 이용한 주소 지정 방식
1. 스택 주소 지정 방식
- 스택 포인터, 베이스 레지스터는 주소 지정에 사용될 수 있는 특별한 레지스터이다.
- 스택포인터는 스택 주소 지정 방식이라는 주소 지정방식에 사용되고, 프로그램 카운터와 베이스 레지스터는 변위 주소 지정 방식이라는 주소 지정방식에 사용된다.
- 스택 주소 지정 방식은 스택과 스택 포인터를 이용한 주소 지정 방식이다.
- 스택 포인터란 스택의 꼭대기를 가리키는 레지스터이다.
- 그렇다면 스택은 어디에 있는걸까? 스택은 메모리 안에 있다. 메모리 안에 스택처럼 사용할 영역이 정해져 있는데, 이를 스택영역이라고 한다.
2. 변위 주소 지정 방식
-
변위 주소 지정 방식이란 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식이다.
-
변위 주소 지정 방식은 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 상대 주소 지정방식, 베이스 레지스터 주소 지정 방식 등으로 나뉜다.
2-1. 상대 주소 지정 방식
- 상대 주소 지정 방식은 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식이다.
- 상대 주소 지정 방식은 프로그래밍 언어의 if문과 유사하게 모든 코드를 실행하는 것이 아닌, 분기하여 특정 주소의 코드를 실행할 때 사용된다.
2-2. 베이스 레지스터 주소 지정 방식
- 베이스 레지스터 주소 지정 방식은 오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식이다.
- 베이스 레지스터는 '기준 주소', 오퍼랜드는 '기준 주소로부터 떨어진 거리'로서의 역할을 한다. 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산하여 유효 주소를 얻어 내는 방식이다.