관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

CPU의 작동 원리 2 - 레지스터 1 : 반드시 알아야 할 레지스터 8가지 본문

알고리즘 및 자료 관리/컴퓨터 구조 & 운영체제

CPU의 작동 원리 2 - 레지스터 1 : 반드시 알아야 할 레지스터 8가지

huenuri 2024. 10. 15. 11:51

수학 공부를 마치고 나니 2교시가 끝났지만 이제 남은 2시간 동안 최대한 집중해서 4단원 학습을 진행해보려고 한다. 분량이 많기도 하고 어려운 내용이라 1시간씩 끝낼 수 있을지 장담할 수 없지만 그래도 최대한 빠르게 학습해 볼 것이다.

레지스터의 종류와 역할을 학습하고 각 레지스터를 통해 명령어가 처리되는 과정을 이해하는 단원이다.

 

 

ALU나 제어장치를 직접 다룰 일은 레지스터에 비해 적다. 하지만 레지스터 안의 값을 관찰하는 일은 생각보다 많다. 특히 저급 언어 개발자, 임베디드, 시스템 개발자들은 이 레지스터를 다룰 일이 훨씬 더 많다고 한다. 그러니 이 내용을 충분히 숙지하기로 하자.

 

프로그램 속 명령어와 데이터는 실행 전후로 반드시 레지스터에 저장된다. 레지스터에 저장된 값만 잘 관찰해도 프로그램의 실행 흐름을 파악할 수 있다. 다시 말해 레지스터 속 값을 유심히 관찰하면 프로그램을 실행할 때 CPU 내에서 무슨 일이 벌어지고 있는지, 어떤 명령어가 어떻게 수행되는지 알 수 있다.

CPU 안에는 다양한 레지스터들이 있고 각기 다른 역할을 가지고 있다. 이번 절에서는 각 레지스터의 이름과 역할을 살펴볼 것이다.


 

 

 

반드시 알아야 할 레지스터

 

상용화된 CPU 속 레지스터들은 CPU마다 이름, 크기, 종류가 매우 다양하다. 이들은 각 CPU 제조사 홈페이지나 공식 문서 등에서 확인할 수 있다. 모든 레지스터를 이곳에서 전부 다룰 수는 없기에 이번 절에서는 여러 전공 서적에서 중요하게 다루는 많은 CPU가 공통적으로 포함하고 있는 8개의 레지스터를 학습해 볼 것이다.

 

꼭 알아야 할 레지스터는 위의 8가지이다. 이 레지스터들은 저마다의 역할이 있고 그에 걸맞는 내용을 저장한다. 각 레지스터가 CPU 내부에서 어떤 역할을 수행하는지 유의하며 읽다 보면 어느새 암기가 될 것이다.

우선 첫번째 프로그램 카운터부터 네 번째 메모리 버퍼 레지스터까지 4개의 레지스터를 살펴보겠다.


 

 

 

 

프로그램 카운터

프로그램 카운터(PC; Program Counter)는 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장한다. 

 

 

 

 

명령어 레지스터

명령어 레지스터(IR; Instruction Registrer)는 해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터이다. 제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤 제어 신호를 내보낸다.

 

 

 

메모리 주소 레지스터

메모리 주소 레지스터(MAR; Memory Address Register)는 메모리의 조수를 저장하는 레지스터이다. 

 

프로그램 카운터는 메모리에서 가져올 명령어의 주소를 실제로 메모리로부터 읽어 들이려면 메모리 주소 레지스터에 저장하고 주소 버스를 통해 내보내게 된다.

 

 

 

메모리 버퍼 레지스터

메모리 버퍼 레지스터(MBR; Memory Buffer Register)는 메모리와 주고받을 값(데이터와 명령어)을 저장하는 레지스터이다. 메모리에 쓰고 싶은 값이나 메모리로부터 전달받은 값은 메모리 버퍼 레지스터를 거친다. CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고받을 값은 메모리 바터 레지스터를 거친다.

 

 

이제 메모리에 저장된 프로그램을 실행하는 과정에서 프로그램 카운터, 명령어 레지스터, 메모리 주소 레지스터, 메모리 버터 레지스터에 어떤 값들이 담기는지 알아보겠다.

 

1. CPU로 실행할 프로그램이 1000번지부터 1500번지까지 저장되어 있다고 가정하겠다. 그리고 1000번지에는 1101(2)이 저장되어 있다고 생각해 보자.

 

 

 

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

 

 

 

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

 

 

 

 

 

4. '메모리 읽기' 제어 신호와 메모리 주소 레지스터 값이 각각 제어 버스와 주소 버스를 통해 메모리로 보낸다. 

 

 

 

 

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

 

 

 

 

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

 

 

7. 제어장치는 명령어 레지스터의 명령어를 해석하고 제어 신호를 발생시킨다.

 

5단계에서 프로그램 카운터 값이 증가한 것을 확인했다. 프로그램 카운터 값이 증가했으나 1000번지 명령어 처리가 끝나면 CPU는 다음 명령어(1001번지)를 읽어 들인다.

이처럼 프로그럼 카운터는 지속적으로 증가하며 계속해서 다음 명령어를 읽어 들일 준비를 한다. 이 과정이 반복되면서 CPU는 프로그램을 차례대로 실행해 나간다. 결국 CPU가 메모리 속 프로그램을 순차적으로 읽어 들이고 실행해 나갈 수 있는 이유는 CPU 속 프로그램 카운터가 꾸준히 증가하기 때문이다.


 

 

 

일반적으로 프로그램 카운터는 꾸준히 증가하며 프로그램을 차례대로 실행한다. 하지만 종종 프로그램 카운터가 실행 중인 명령어의 다음 번지 주소가 아닌 전혀 다른 값으로 업데이트되는 경우가 있다. 이런 상황이라면 프로그램이 차례대로 실행되지 않는다. 이 부분은 조금 이해가 되지 않아 다음에 한번 더 보충해서 기록할 생각이다.


 

 

 

범용 레지스터

범용 레지스터는 이름 그대로 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터이다. 메모리 버퍼 레지스터는 데이터 버스로 주고받을 값만 저장하고, 메모리 주소 레지스터는 주소 버스로 내보낼 주소값만 저장하지만, 범용 레지스터는 데이터와 주소를 모두 저장할 수 있다.

 

 

플래그 레지스터

ALU 연산 결과에 따른 플래그를 플래그 레지스터에 저장한다. 

 

 

 


 

 

 

학습을 마치고

레지스터 단원은 분량이 많아서 두 개로 나누어서 학습일지를 쓰기로 했다. 여기서는 반드시 알아야 할 레지스터에 대해서 공부해 보았는데 내용이 많이 어려웠다.

무슨 말인지 한번 들어서는 잘 모르겠고 여러 번 반복해서 학습해야 이해할 수 있을 것 같다. 레지스터의 종류가 이처럼 많다는 걸 알게 된 시간이었다.