레지스터

mmmhmm·2024년 2월 14일
0

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

필수 숙지 레지스터

상용화된 CPU 속 레지스터들은 CPU마다 이름, 크기, 종류가 다양하다. 공식 문서나 홈페이지에서 확인 가능하지만 모든 레지스터를 알 수는 없지만, 중요 레지스터는 8개가 있다.

1. 프로그램 카운터
2. 명령어 레지스터
3. 메모리 주소 레지스터
4. 메모리 버퍼 레지스터
5. 플래그 레지스터
6. 범용 레지스터
7. 스택 포인터
8. 베이스 레지스터

하나씩 설명해보겠다.

프로그램 카운터

  • 메모리에서 가져올 명령어의 주소
  • 메모리에서 읽어 들일 명령어의 주소를 저장
  • 프로그램 카운터를 명령어 포인터라고 부르는 CPU도 있다.

명령어 레지스터

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

메모리 주소 레지스터

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

메모리 버퍼 레지스터

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

    ☆ 메모리 버퍼 레지스터는 메모리 데이터 레지스터(MDR : Memory Data Register)이라고 부른다

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

01

CPU로 실행할 프로그램이 1000번지부터 1500번지까지 저장되어 있다고 가정하자. 그리고 1000번지에는 110121101_{2}이 저장되었다고 가정

02

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

03

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

04

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

05

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

06

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

07

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

05단계에서 프로그램 카운터 값이 증가한 것을 확인했다. 프로그램 카운터 값이 증가했으니 1000번지 명령어 처리가 끝나면 CPU는 다음 명령어 (1001번지)를 읽어 들인다.
프로그램 카운터는 지속적으로 증가하며 계속해서 다음 명령어를 읽을 준비를 한다. 이 과정이 반복되면서 CPU는 프로그램을 차례대로 실행해 나간다. 결국 CPU가 메모리 속 프로그램을 순차적으로 읽어 들이고 실행해 나갈 수 있는 이유는 CPU 속 프로그램 카운터가 꾸준히 증가하기 때문이다.

잠깐!
순차적인 실행 흐름이 끊기는 경우
일반적으로 프로그램 카운터는 꾸준히 증가하며 프로그램을 차례대로 실행합니다. 하지만 종종 프로그램 카운터가 실행 중인 명령어의 다음 번지 주소가 아닌 전혀 다른 값으로 업데이트되는 경우가 있습니다. 이런 상황이라면 프로그램이 차례대로 실행되지 않습니다. 이런 상황은 언제 발생할까요?


명령어 중 JUMP, CONDITIONAL JUMP, CALL, RET와 같이 특정 메모리 주소로 실행 흐름을 이동하는 명령어가 실행되었을 때 프로그램은 차례대로 실행되지 않습니다. 이런 경우 프로그램 카운터에는 변경된 주소가 저장됩니다.


가령 1200번지를 실행하는 도중 JUMP 2500이라는 명령어를 만났다고 가정해 보죠. 이 명령어는 "2500번지로 점프하라", "2500번지부터 실행하라"라는 명령어입니다. 이 명령어를 실행한 다음에는 1201번지가 아닌 2500번지를 실행해야하기 때문에 프로그램 카운터에는 1201번지가 아닌 2500번지가 저장됩니다.


또한 인터럽트가 발생해도 프로그램의 순차적인 실행 흐름이 끝어집니다. 이는 다음 절에서 자세히 다루겠습니다.

범용 레지스터

  • 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
  • 메모리 버퍼 레지스터는 데이터 버스로 주고받을 값만 저장하고, 메모리 주소 레지스터는 주소 버스로 보낼 주소값만 저장하지만, 범용 레지스터는 데이터와 주소를 모두 저장할 수 있다.
  • CPU안에 여러 개의 범용 레지스터들이 있고, 현대 대다수 CPU는 모두 범용 레지스터를 갖고 있다.

플래그 레지스터

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

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

스택 포인터, 베이스 레지스터는 주소 지정에 사용될 수 있는 특별한 레지스터이다. 스택 포인터는 스택 주소 지정 방식이라는 주소 지정 방식에 사용되고, 프로그램 카운터와 베이스 레지스터는 변위 주소 지정 방식이라는 주소 지정 방식에 사용

스택 주소 지정 방식

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

스택은 한쪽 끝이 막혀있는 통과 같은 저장 공간이다. 그래서 스택은 가장최근에 저장하는 값부터 꺼낼 수 있다.

여기서 스택 포인터란 스택의 꼭대기를 가리키는 레지스터이다. 즉, 스택 포인터는 스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터이다.

그림과 같이 위에서부터 매겨져 있고 아래부터 데이터가 저장되어 있는 스택이 있을때 스택 포인터는 스택의 제일 꼭대기 주소, 즉 4번지를 저장하고 있다. 스택 포인터는 스택의 어디까지 데이터가 채워져있는지에 대한 표시라고 이해 하자.

스택은 어디에있는것?

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

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

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

그래서 변위 주소 지정 방식을 사용하는 명령어는 다음 그림과 같이 연산 코드 필드, 어떤 레지스터의 값과 더할지를 나타내는 레지스터 필드, 그리고 주소를 담고 있는 오퍼랜드 필드가 있다.

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

상대 주소 지정 방식

오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식이다.
프로그램 카운터에는 읽어 들일 명령어의 주소가 저장되어 있다. 만약 오퍼랜드가 음수 -3이라면 CPU는 읽어 들이기로 한 명령어로부터 '3번째 이전' 번지로 접근한다.

반대로 오퍼랜드가 +3이라면 '3번째 앞' 번지로 접근한다. 즉, 실행하려는 명령어에서 세 칸 건너뛴 번지를 실행하는 것.

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

오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식이다.
베이스 레지스터는 '기준 주소', 오퍼랜드는 '기준 주소로부터 떨어진 거리'로서의 역할을 한다. 즉, 베이스 레지스터 주소 지정 방식은 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산하여 유효 주소를 얻어내는 방식이다. 베이스 레지스터에 200이라는 값이 있고 오퍼랜드에 40이라면 "기준 주소 200번지로부터 40만큼 떨어진 240번지로 접근"의 의미다. 또 베이스 레지스터에 550이라는 값이 담겨 있고 오퍼랜드가 50이라면 550에서 떨어진 600번지로 접근하라는것이다.

profile
어라? 금지

0개의 댓글