[컴퓨터 구조] CPU : 레지스터

bien·2024년 8월 11일
0

컴퓨터구조

목록 보기
6/10

레지스터

  • 프로그램 속 명령어와 데이터는 실행 전 후로 반드시 레지스터에 저장
    • 레지스터에 저장된 값만 잘 관찰해도 프로그램의 실행 흐름을 파악할 수 있다.
      • 즉, CPU에서 벌어지고 있는 일, 어떤 명령어가 어떻게 수행되는지 알 수 있다.
  • CPU안에는 다양한 레지스터들이 있고, 각기 다른 역할을 가지고 있다.

레지스터의 종류

상용화 된 CPU 속 레지스터들은 CPU마다 이름, 크기, 종류가 매우 다양하다. 이들은 각 CPU 제조사 홈페이지나 공식 문서에서 확인 가능하다.

  • 프로그램 카운터(PC: ProgramCounter)
    • 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장한다.
    • 명령어 포인터(IP: Instruction Pointer)라고 부르는 CPU도 있다.
  • 명령어 레지스터 (IR: Instruction Register)
    • 방금 메모리에서 읽어들인 (해석할) 명령어를 저장하는 레지스터.
    • 제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤 제어 신호를 보낸다.
  • 메모리 주소 레지스터 (MAR: Memory Address Register)
    • 메모리의 주소를 저장하는 레지스터
    • CPU가 읽어들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거치게 된다.
  • 메모리 버퍼 레지스터 (Memory Buffer Register)
    • 메모리와 주고받을 값(데이터와 명령어)을 저장하는 레지스터
    • 즉, 메모리에 쓰고 싶은 값이나 메모리로부터 전달받은 값은 메모리 버퍼 레지스터를 거친다.
      • 메모리 데이터 레지스터(MDR: Memory Data Register)라고도 부른다.
  • 범용 레지스터 (General Purpose Register)
    • 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터.
      • 예를 들어, 메모리 버퍼 주소는 데이터 버스로 주고받을 값만 저장하고, 메모리 주소 레지스터는 주소 버스로 내보낼 주소값만 저장하지만, 범용 레지스터는 데이터와 주소를 모두 저장할 수 있다.
    • 일반적으로 CPU안에는 여러 개의 범용 레지스터들이 있고, 현대 대다수 CPU는 모두 범용 레지스터들을 가지고 있다.
  • 플래그 레지스터 (Flag Register)
    • 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터.
  • 스택 포인터 (Stack Pointer)
    • 스택 주소 지정방식에 이용
  • 베이스 레지스터 (Base Register)
    • 변위 주소 지정방식 중 베이스 레지스터 주소 지정방식에서 사용

레지스터들의 작동 과정

이해를 위해 프로그램을 이루는 명령어들은 각각 하나의 메모리 번지를 차지하고 있다고 가정한다.

  1. CPU로 실행할 프로그램이 1000번지부터 1500번지까지 저장되어 있다고 가정하자.
    • 1000번지에는 1101(2진수)이 저장되어 있다.
  2. 프로그램을 처음부터 실행하기 위해 프로그램 카운터에는 1000이 저장된다.
    • 이는 메모리에서 가져올 명령어가 1000번지에 있음을 의미한다.
  3. 1000번지를 읽어 들이기 위해서는 주소 버스로 1000번지를 내보내야 한다.
    • 이를 위해 메모리 주소 레지스터에는 1000이 저장된다.
  4. '메모리 읽기' 제어 신호와 메모리 주소 레지스터 값이 각각 제어 버스와 주소 버스를 통해 메모리로 보내진다.
  5. 메모리 1000번지에 저장된 값은 데이터 버스를 통해 메모리버퍼 레지스터로 전달되고, 프로그램 카운터는 증가되어 다음 명령어를 읽어들일 준비를 한다.
  6. 메모리 버퍼 레지스터에 저장된 값은 명령어 레지스터로 이동한다.
  7. 제어장치는 명령어 레지스터의 명령어를 해석하고 제어 신호를 발생시킨다.

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

🔎 순차적인 실행 흐름이 끊기는 경우

일반적으로 프로그램 카운터는 꾸준히 증가하면서 프로그램을 차례대로 실행한다. 하지만 종종 프로그램 카운터가 실행 중인 명령어의 다음 번지 주소가 아닌 전혀 다른 값으로 업데이트 되는 경우가 있다. 이런 상황이라면 프로그램이 차례대로 실행되지 않는다. 어떤 경우 이런 상황이 발생할까?

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

가령 1200번지를 실행하는 도중 JUMP 2500이라는 명령어를 만나면, 1201번지가 아닌 2500번지를 실행해야 하기 때문에 프로그램 카운터에는 1201번지가 아닌 2500번지가 저장된다.

또한 인터럽트가 발생해도 프로그램의 순차적인 실행 흐름이 끊어진다.

주소 지정 방식

1. 스택 주소 지정방식

  • 스택 주소 지정방식
    • 스택과 스택 포인터를 이용한 주소 지정 방식
    • 스택: 한쪽 끝이 막혀있는 통과 같은 저장 공간
      • 따라서, 스택은 가장 최근에 저장하는 값 부터 꺼낼 수 있다.
      • 스택 영역: 메모리에 스택 용도로 사용하기 위해 암묵적으로 약속된 영역

2. 변위 주소 지정방식

명령어는 연산 코드오퍼랜드로 이루어진다.
오퍼랜드 필드에는 메모리의 주소가 담길 때도 있다.

  • 변위 주소 지정 방식(displacement addressing mode)
    • 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식
    • 연산 코드 필드(수행해야 할 내용) + 레지스터 필드(어떤 레지스터의 값을 더할지를 나타내는 필드) + 오퍼랜드 필드(주소를 담고 있음)
    • 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식 등으로 나뉜다.

상대 주소 지정방식(relative addressing mode)

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

프로그램 카운터에는 읽어들일 명령어의 주소가 저장되어 있다.
만약 오퍼랜드가 음수, (여기선 -3)이었다면 CPU는 읽어들이기로 한 명령어로부터 '세 번째 이전' 번지로 접근한다.
즉, 실행하려는 명령어의 세 칸 이전 번지 명령어를 실행하는 것이다.
반면 오퍼랜드가 양수, 가령 3이었다면 CPU는 읽어들이기로 했던 명령어의 '세 번째 이후' 번지로 접근한다.
즉, 실행하려는 명령어에서 세 칸 건너뛴 번지를 실행하는 것이다.

상대 주소 지정 방식은 프로그래밍 언어의 if문과 유사하게 모든 코드를 실행하는 것이 아닌, 분기하여 특정 주소의 코드를 실행할 때 사용한다.

베이스 레지스터 주소 지정방식(base-register addressing mode)

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

profile
Good Luck!

0개의 댓글