상세 컨텐츠

본문 제목

[혼공컴운] Ch4. CPU의 작동 원리 (레지스터)

본문

레지스터

레지스터는 CPU 내부의 작은 임시저장장치.

  • 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장된다
  • 레지스터는 앞선 ALU와 제어장치 대비 프로그래머 입장에서 더 중요하다. 우리가 개발하고 실행하는 것이 명령어, 데이터이기 때문이다. 우리는 레지스터에 담긴 값들을 관찰할 수 있다. 업무상으로도 레지스터에 담긴 값을 관찰할 일이 생각보다 많다. 로우레벨(시스템, 임베디드, 해킹 등) 개발자들은 더더욱 많다.

 

레지스터의 종류

CPU 내부에는 다양한 종류의 레지스터가 있고, 각각의 역할이 있다

(CPU마다 레지스터 종류와 이름이 다르기에, 일단 공통적인 것들을 일반화해서 알아두자)

 

  1. 프로그램 카운터 (명령어 포인터, Instruction Pointer)
    • 메모리에서 읽어들일 명령어의 주소를 저장한다
  2. 메모리 주소 레지스터
    • 메모리의 주소 를 저장한다
    • CPU가 주소 버스를 이용해야 할 때, 즉 읽어들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터
  3. 메모리 버퍼 레지스터
    • 메모리와 주고받을 값(데이터와 명령어)을 저장한다
    • CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터
  4. 명령어 레지스터
    • 해석할 명령어(방금 메모리에서 읽어들인 명령어)를 저장한다
  5. 플래그 레지스터
    • 연산 결과 또는 CPU 상태에 대한 부가정보
  6. 범용 레지스터
    • 다양하고 일반적인 상황에서 자유롭게 사용
    • 범용 레지스터는 보통 여러개 있다.
    • 주소, 명령어, 데이터 등을 다 담을 수 있다
  7. 스택 포인터
    • 스택의 꼭대기를 가리키는 레지스터 (스택이 어디까지 차 있는지에 대한 표시)
    • 스택 주소 지정 방식에 사용된다 (섹션3의 주소 지정 방식, 하단의 스택 주소 지정 방식 참고)
  8. 베이스 레지스터
    • 기준 주소를 저장한다
    • 변위 주소지정 방식에 사용된다

 

레지스터를 통한 CPU 동작 방식의 이해

레지스터 1~4번을 통한 CPU와 메모리의 동작 방식에 대해 이해해보자

(프로그램 카운터, 메모리 주소 레지스터, 메모리 버퍼 레지스터, 명령어 레지스터)

 

 

메모리에 실행할 프로그램이 저장되어 있다.

각각의 명령어와 데이터는 1000번지~1500번지에 있다고 가정하자.

 

1000번지에 있는 명령어(1101)부터 실행한다면 다음 과정을 거친다

프로그램 카운터: 1000번지가 저장된다.

 

 

프로그램 카운터 -> 메모리 주소 레지스터: 메모리 주소(1000번지)를 복사한다

주소 버스에다가 읽고자하는 메모리 주소(1000번지)를 쏴줘야 하기 때문이다

 

 

제어장치 → 제어 버스 → 메모리: 메모리 읽기 신호 를 쏴준다

메모리 주소 레지스터 -> 주소 버스 -> 메모리 : 읽고싶은 메모리 주소를 쏴준다

 

이들을 더하면, ‘몇 번지의 메모리를 읽어라’ 라는 신호가 된다

 

메모리 → 데이터 버스 -> 메모리 버퍼 레지스터: 1000번지에 저장된 데이터(1101)를 전달한다.

프로그램 카운터 : 다음으로 실행할 주소로 바뀐다. (1 증가)

 

메모리 버퍼 레지스터 -> 명령어 레지스터: 갖고온 명령어(1101)를 복사한다 명령어를 해석하기 위해 명령어 레지스터(해석 대기장..)로 보낸다

 

앞서 프로그램 카운터에 1 증가된 주소가 저장되었다 → 자동으로 다음 작업을 한다 → .. 반복

 

 

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

  • 특정 메모리 주소로 실행 흐름을 이동하는 명령어의 실행 시 (e.g. JUMP, CONDITIONAL JUMP, CALL, RET)
  • 인터럽트 발생 시

 

특정 레지스터를 이용한 주소지정 방식

1. 스택 주소 지정 방식 (스택포인터 이용)

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

 

예를 들어, 스택에 4번지까지 채워져 있다면 스택 포인터는 4번지를 가리키게 된다.

 

 

 

스택은 메모리 안에 있다. 정확히 말하면, 메모리 안에 스택 영역이 따로 지정되어 있다.

 

2. 변위 주소지정 방식

 

  • 변위 주소지정 방식: 변위 + 특정 레지스터 값 = 유효 주소
  • 변위 주소지정 방식을 사용하는 명령어는 아래와 같은 형태를 지닌다

변위 주소지정 방식은 크게 두 가지이다.

 

1) 상대 주소지정 방식

- 프로그램 카운터를 이용한다

- 오퍼랜드 필드의 값(변위) + 프로그램 카운터 값 = 유효 주소

 

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

- 베이스 레지스터를 이용한다. 베이스 레지스터는 기준 주소 역할을 한다.

- 오퍼랜드 필드의 값(변위) + 베이스 레지스터 값 = 유효 주소

프로그램 카운터(명령어 포인터) or 베이스 레지스터에 저장된 주소를 offset이라고 한다

 

 

상대 주소지정 방식 vs 베이스 레지스터 주소지정 방식 (chatGPT)

 

 

관련글 더보기