Post

2026-06-02 TIL (69일차)

2026-06-02 TIL (69일차)

[TIL] 컴퓨터 구조: CPU와 레지스터 (Registers)


1. CPU의 3가지 핵심 구성 요소

  1. ALU (산술논리연산장치): 계산과 연산을 수행하는 일종의 회로입니다.
  2. 제어장치 (Control Unit): 명령어를 해석하고, 각 부품을 작동시키기 위한 ‘제어 신호’를 내보내는 장치입니다.
  3. 레지스터 (Register): CPU가 명령어를 처리하는 과정에서 발생하는 값들을 저장하는 임시 저장 장치입니다.

왜 레지스터가 개발자에게 가장 중요할까?

CPU가 명령어를 처리하기 전후로 데이터는 반드시 레지스터를 거치게 됩니다. 따라서, C나 C++ 등으로 개발할 때 디버깅 도구(GDB 등)를 이용해 레지스터에 어떤 값들이 저장되어 있는지 관찰하면, 프로그램이 가장 낮은 하드웨어 수준에서 어떻게 동작하고 있는지 상세히 파악할 수 있습니다.


2. 반드시 알아야 할 5가지 대표적인 레지스터

CPU마다(인텔, Apple M1 등) 레지스터의 이름과 종류는 다를 수 있지만, 공통으로 사용되는 핵심 레지스터는 다음과 같습니다.

① 프로그램 카운터 (PC, Program Counter)

  • 역할: 메모리에서 다음으로 읽어 들일(인출할) 명령어의 주소를 저장합니다.
  • 참고: 일부 CPU에서는 명령어 포인터(IP, Instruction Pointer)라고도 부릅니다.
  • 동작 원리: 일반적으로 프로그램 카운터 값은 1씩 순차적으로 증가합니다. (명령어가 순서대로 실행되는 이유)
  • 예외 상황 (순차 증가하지 않는 경우):
    • if문, goto문과 같은 제어문 흐름 변경 시
    • 함수 호출(Function Call)이 발생하여 메모리상 전혀 다른 번지수로 건너뛰어야 할 때

② 명령어 레지스터 (IR, Instruction Register)

  • 역할: 프로그램 카운터가 가리켰던 주소에서 방금 막 읽어 들인(인출한) 명령어를 저장합니다.
  • 동작 원리: 제어장치는 이 명령어 레지스터 속 명령어를 해석하여 ALU에게 연산을 지시하거나 제어 신호를 발생시킵니다.

③ 범용 레지스터 (GPR, General Purpose Register)

  • 역할: 다목적으로 사용되는 레지스터입니다. (데이터, 주소, 명령어 모두 저장 가능)
  • 특징: 오늘날 대부분의 CPU는 여러 개의 범용 레지스터를 보유하고 있으며, 프로그램 실행 중 아주 적극적으로 활용됩니다. (예: eax, ebx 등)

④ 플래그 레지스터 (Flag Register)

  • 역할: 연산의 결과나 CPU의 현재 상태에 대한 부가 정보(플래그)를 저장합니다.
  • 대표적인 플래그 종류:
    • 부호 플래그 (Sign Flag): 연산 결과가 양수인지 음수(1)인지 나타냄.
    • 제로 플래그 (Zero Flag): 연산 결과가 0인지(1) 아닌지 나타냄.
    • 캐리 플래그 (Carry Flag): 연산 중 올림수나 빌림수가 발생했는지 여부.
    • 오버플로우 플래그 (Overflow Flag): 데이터가 공간보다 커서 넘쳐흐르는 현상(오버플로우) 발생 여부.
    • 인터럽트 플래그 (Interrupt Flag): 현재 인터럽트 허용 여부.
    • 슈퍼바이저 플래그 (Supervisor Flag): 커널 모드인지 사용자 모드인지 상태를 나타냄.

⑤ 스택 포인터 (SP, Stack Pointer)

  • 역할: 메모리 내 스택(Stack) 영역에서, 데이터가 쌓여 있는 가장 꼭대기(Top) 위치의 주소를 가리키는 레지스터입니다.
  • 특징: 데이터를 PUSH(추가)하거나 POP(제거)할 때마다 스택 포인터의 값이 변하여 현재 스택이 얼마나 채워져 있는지 나타냅니다.

🎯 요약

  • 개발자는 디버깅 시 레지스터(특히 범용 레지스터와 프로그램 카운터 등)를 확인하여 프로그램의 저수준 동작을 추적할 수 있습니다.
  • PC(다음 실행할 주소) ➡️ IR(현재 실행할 명령어) ➡️ 범용 레지스터(연산 데이터) ➡️ 플래그 레지스터(연산 결과/상태) 의 유기적인 흐름을 이해하는 것이 핵심입니다.
This post is licensed under CC BY 4.0 by the author.