[컴퓨터 구조/운영체제] 레지스터

myungji·2024년 4월 22일

이 글은 한빛미디어 출판사의 '혼자 공부하는 컴퓨터 구조+운영체제(강민철 저)'를 정리한 내용입니다.

프로그램 속 명령어와 데이터는 실행 전후로 반드시 레지스터에 저장된다.
따라서 레지스터만 잘 관찰해도 프로그램의 자세한 실행 과정을 알 수 있다.

1. 반드시 알아야 할 레지스터들

CPU 속 레지스터들은 CPU마다 이름, 크기, 종류가 매우 다양하다.

1-1. 프로그램 카운터(PC, Program Counter)

메모리에서 가져올 명령어의 주소를 저장.
프로그램 카운터를 명령어 포인터(IP, Instruction Pointer)라고 부르는 CPU도 있다.

1-2. 명령어 레지스터(IR, Instruction Register)

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

1-3. 메모리 주소 레지스터(MAR, Memory Address Register)

메모리의 주소를 저장하는 레지스터.
CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거치게 된다.

1-4. 메모리 버퍼 레지스터(MBR, Memory Buffer Register)

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

1-5. 범용 레지스터(general purpose register)

다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터.
데이터주소를 모두 저장할 수 있다.
일반적으로 CPU 안에는 여러 개의 범용 레지스터들이 있고, 현대 대다수 CPU는 모두 범용 레지스터를 가지고 있다.

1-6. 플래그 레지스터(flag register)

ALU의 연산 결과에 따른 플래그를 저장하는 레지스터.
연산 결과 또는 CPU 상태에 대한 부가 정보를 저장한다.

2. 예시로 알아보는 동작 과정

① CPU로 실행할 프로그램이 메모리의 1000번지부터 1500번지까지 담겨있다.
1000번지에는 1101(2)가 저장되어 있다.

② PC(Program Counter)에 1000이 저장된다. 메모리에서 가져올 명령어가 1000번지에 있다는 뜻.

③ 1000번지의 값을 읽기 위해 주소 버스로 1000번지를 내보낸다.
이 때 메모리 주소 레지스터에 1000이 저장된다.

④ '메모리 읽기' 제어 신호가 제어 버스를 통해 메모리로 보내지고,
메모리 주소 레지스터 값이 주소 버스를 통해 메모리로 보내진다.

⑤ 1000번지 메모리에 저장된 1101(2)이 데이터 버스를 통해 전해진다.
이 때 메모리 버퍼 레지스터에 1101(2)가 저장된다.

⑥ 프로그램 카운터의 주소값이 1증가되어 다음 명령어를 읽어 들일 준비를 한다.

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

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

CPU가 메모리 속 프로그램을 순차적으로 읽어 들이고 실행해 나갈 수 있는 이유는
CPU 속 프로그램 카운터가 꾸준히 증가하기 때문.

3. 특정 레지스터를 이용한 주소 지정 방식(1): 스택 주소 지정 방식

스택 주소 지정 방식
스택과 스택 포인터를 이용한 주소 지정 방식

스택 포인터란?
스택의 꼭대기를 가리키는 레지스터로, 스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터이다.
쉽게 말하자면, 스택의 어디까지가 데이터로 채워져 있는지에 대한 표시이다.

스택에서 데이터가 하나 꺼내지면 스택 포인터가 가리키는 위치도 달라지고,
스택에 데이터가 추가되어도 스택 포인터가 가리키는 위치가 달라진다.

그런데, 스택은 어디에 있는 것일까?

메모리의 스택 영역에 존재한다.
메모리 안에 스택처럼 사용할 영역이 정해져 있는데, 이를 스택 영역이라고 한다.
이 영역은 다른 주소 공간과는 다르게 스택처럼 사용하기로 암묵적으로 약속된 영역이다.

4. 특정 레지스터를 이용한 주소 지정 방식(2): 변위 주소 지정 방식

오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식.
(유효 주소) = (오퍼랜드 필드 값) + (특정 레지스터 값)

따라서 변위 주소 지정 방식을 사용하는 명령어는 아래와 같은 구성으로 명령어가 이루어져 있다.
1. 연산 코드: 어떤 연산을 수행할지
2. 레지스터: 이 레지스터 값과
3. 오퍼랜드: 이 오퍼랜드 필드에 있는 주소값을 더한 데이터로 연산을 수행

이 때, 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식 등으로 나뉜다.

① 상대 주소 지정 방식

오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻어내는 방식.

프로그램 카운터에는 읽어 들일 명령어의 주소가 저장되어 있다.
만약 오퍼랜드에 '-3'이 있다면 CPU는 읽어 들이기로 한 명령어로부터 '3번째 이전'번지로 접근한다.
만약 오퍼랜드에 '3'이 있었다면 CPU는 읽어 들이기로 한 명령어로부터 '3번째 이후'번지로 접근한다.

상대 주소 지정 방식은 if문과 유사하게 모든 코드를 실행하는 것이 아니라
분기하여 특정 주소의 코드를 실행할 때 사용된다.

② 베이스 레지스터 주소 지정 방식

오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻어내는 방식.

베이스 레지스터는 '기준 주소'의 역할, 오퍼랜드는 '기준 주소로부터 떨어진 거리'의 역할을 한다.
즉, 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산하여 유효 주소를 얻어내는 방식.

만약 베이스 레지스터에 200이라는 값이 있고 오퍼랜드가 40이라면,
이는 기준 주소 200번지로부터 40만큼 떨어진 240번지로 접근하라는 의미이다.

또 베이스 레지스터에 550이라는 값이 담겨 있고 오퍼랜드가 50이라면,
이는 기준 주소 550번지로부터 50만큼 떨어진 600번지로 접근하라는 의미이다.


출처 - '혼자 공부하는 컴퓨터 구조+운영체제(한빛미디어, 강민철 저)'

profile
iOS 초보바리

0개의 댓글