ARCHITECTURE

[아키텍처] CPU의 구조와 동작 원리

ch010104 2025. 3. 13. 20:43

1. CPU의 역할과 명령어 실행 과정

CPU(중앙처리장치)는 기억장치에 저장된 명령어를 실행하여 프로그램을 수행하는 핵심 장치

  1. 명령어 인출 (Instruction Fetch)
    • 기억장치에서 명령어를 가져옴.
  2. 명령어 해독 (Instruction Decode)
    • 명령어를 분석하여 수행할 동작 결정.
  3. 데이터 인출 (Data Fetch)
    • 명령어 실행을 위해 필요한 데이터를 기억장치 또는 I/O 장치에서 읽어옴.
  4. 데이터 처리 (Data Process)
    • 연산 수행 (산술·논리 연산 등).
  5. 데이터 저장 (Data Store)
    • 연산 결과를 저장.

위 과정 중 1~2번 과정은 모든 명령어에서 수행되지만, 3~5번 과정은 명령어에 따라 선택적으로 수행


2. CPU의 기본 구조

CPU는 다음과 같은 주요 구성 요소로 이루어져 있음

  • 산술논리연산장치(ALU)
    • 덧셈, 뺄셈, 논리 연산(AND, OR, NOT 등)을 수행하는 하드웨어 모듈.
  • 레지스터(Register)
    • CPU 내부의 고속 기억장치로 데이터를 빠르게 저장하고 처리.
  • 제어 유니트(Control Unit)
    • 명령어를 해독하고 실행을 위한 제어 신호 생성.
  • CPU 내부 버스
    • CPU 내부에서 데이터를 전달하는 통로.

2.1 주요 레지스터

CPU 내부에는 다양한 레지스터가 있다.

레지스터 설명
프로그램 카운터 (PC) 다음 실행할 명령어의 주소 저장
명령어 레지스터 (IR) 현재 실행 중인 명령어 저장
누산기 (AC) 연산 결과를 일시적으로 저장
메모리 주소 레지스터 (MAR) 메모리에서 읽거나 쓸 주소 저장
메모리 버퍼 레지스터 (MBR) 메모리에서 읽어온 데이터나 저장할 데이터를 임시 보관

3. 명령어 실행 과정

CPU는 클록 신호에 따라 명령어를 실행하며, 이를 **명령어 사이클(Instruction Cycle)**이라고 함.

명령어 사이클은 **인출 사이클(Fetch Cycle)**과 **실행 사이클(Execution Cycle)**로 나뉨

3.1 인출 사이클 (Fetch Cycle)

CPU는 프로그램 카운터(PC)가 가리키는 기억장치의 위치에서 명령어를 인출.

 

CPU 클록 주기 동작 설명
t0 MAR ← PC PC의 값을 내부 버스를 통해 MAR로 보냄
t1 MBR ← M[MAR], PC ← PC + 1 메모리에서 MAR이 가리키는 명령어를 MBR로 이동, PC 값 증가
t2 IR ← MBR MBR에 저장된 명령어를 명령어 레지스터(IR)로 이동

총 3개의 CPU 클록 주기 동안 실행됨.


3.2 실행 사이클 (Execution Cycle)

실행 사이클에서는 CPU가 인출된 명령어를 해독하고 연산을 수행한다. 실행 사이클에서 CPU가 수행하는 연산들은 다음과 같이 분류할 수 있음

1) 데이터 이동 연산 (LOAD addr)

설명: 기억장치에 저장된 데이터를 AC로 로드하는 연산
마이크로 연산 표현:

CPU 클록 주기 동작 설명
t0 MAR ← IR(addr) 명령어의 오퍼랜드(주소)를 MAR로 보냄
t1 MBR ← M[MAR] MAR이 가리키는 메모리 위치에서 데이터를 MBR로 이동
t2 AC ← MBR MBR에 저장된 데이터를 AC에 적재

 

2) 데이터 처리 연산 (ADD addr)

설명: AC 레지스터의 값과 메모리에서 가져온 값을 더하는 연산


마이크로 연산 표현:

CPU 클록 주기 동작 설명
t0 MAR ← IR(addr) 명령어의 오퍼랜드(주소)를 MAR로 보냄
t1 MBR ← M[MAR] MAR이 가리키는 메모리 위치에서 데이터를 MBR로 이동
t2 AC ← AC + MBR MBR의 값과 AC 값을 더하여 결과를 AC에 저장

 

3) 데이터 저장 연산 (STA addr)

설명: AC 레지스터의 데이터를 메모리에 저장하는 연산
마이크로 연산 표현:

CPU 클록 주기 동작 설명
t0 MAR ← IR(addr) 데이터를 저장할 메모리 주소를 MAR로 보냄
t1 MBR ← AC AC의 데이터를 MBR로 이동
t2 M[MAR] ← MBR MBR의 값을 메모리에 저장

 

4) 프로그램 제어 연산 (JUMP addr)

설명: 특정 주소로 분기(Branch)하는 연산
마이크로 연산 표현:

CPU 클록 주기 동작 설명
t0 PC ← IR(addr) 명령어의 오퍼랜드(주소)를 PC로 저장

다른 위치의 명령어로 실행 순서를 바꾸는 분기(branch) 명령어 -> JUMP 라고도 함!


4. 명령어 실행 예제

  • 편의상 기계 코드를 10진수로 표현
  • LOAD 1, STA 2, ADD 5, JUMP 8로 가정
  • 즉, 기계 코드의 첫 숫자는 연산 코드이고 그 다음 세 숫자들은 오퍼랜드로서 기억장치 주소를 나타냄

1) 예시 1

 

주소 명령어 기계 코드
100 LOAD 250 1 250
101 ADD 251 5 251
102 STA 251 2 251
103 JUMP 170 8 170
  • 실행 단계별 설명
단계 설명
1단계 첫 번째 명령어(LOAD 250) 인출. PC가 100번지를 가리키고 있으며, 명령어가 IR로 이동.
2단계 명령어 해독 후, 250번지의 데이터를 AC로 로드. PC 값 증가.
3단계 두 번째 명령어(ADD 251) 인출. IR에 저장.
4단계 AC의 값과 251번지의 값을 더하여 연산 수행. 결과를 AC에 저장. PC 값 증가.
5단계 세 번째 명령어(STA 251) 인출. IR에 저장.
6단계 AC의 내용을 251번지에 저장. PC 값 증가.
7단계 네 번째 명령어(JUMP 170) 인출. IR에 저장.
8단계 PC에 170번지를 저장하여 프로그램 흐름을 변경.

2) 예시 2

 

[단계 1] LOAD 명령어 인출

  1. **PC(프로그램 카운터)**가 현재 0100을 가리키고 있다.
  2. 해당 주소(100번지)의 내용을 읽어 명령어 레지스터(IR)에 저장한다.
  3. **100번지에는 1250**이라는 명령어가 있으며, 이를 IR에 저장한 후 PC 값을 0101로 증가한다.

결과:

  • IR ← 1250 (LOAD 250)
  • PC ← 0101

[단계 2] LOAD 명령어 실행

  1. 1250 명령어를 해독한다.
    • LOAD 250이므로, 250번지의 데이터를 AC 레지스터로 이동하는 명령어이다.
  2. 250번지에서 값(0004)을 읽어와 AC에 저장한다.

결과:

  • AC ← 0004
  • LOAD 명령어 실행 완료
  • PC는 그대로 0101

[단계 3] ADD 명령어 인출

  1. PC가 101번지를 가리킨다.
  2. 101번지에서 명령어(5251)를 인출하여 IR에 저장한다.
  3. PC 값을 증가시켜 0102로 변경한다.

결과:

  • IR ← 5251 (ADD 251)
  • PC ← 0102

[단계 4] ADD 명령어 실행

  1. 5251 명령어를 해독한다.
    • ADD 251이므로, AC와 251번지의 데이터를 더하는 연산이다.
  2. 251번지에서 데이터를 가져온다.
    • 251번지의 값: 0003
  3. ALU를 사용하여 연산 수행:
    • 0004 + 0003 = 0007
  4. 연산 결과를 다시 AC에 저장한다.

결과:

  • AC ← 0007
  • PC는 그대로 0102

[단계 5] STA 명령어 인출

  1. PC가 102번지를 가리킨다.
  2. 102번지에서 명령어(2251)를 인출하여 IR에 저장한다.
  3. PC 값을 증가시켜 0103으로 변경한다.

결과:

  • IR ← 2251 (STA 251)
  • PC ← 0103

[단계 6] STA 명령어 실행

  1. 2251 명령어를 해독한다.
    • STA 251이므로, AC 값을 251번지에 저장하는 명령어이다.
  2. 현재 AC 값 0007을 251번지에 저장한다.

결과:

  • M[251] ← 0007
  • STA 명령어 실행 완료
  • PC는 그대로 0103

[단계 7] JUMP 명령어 인출

  1. PC가 103번지를 가리킨다.
  2. 103번지에서 명령어(8170)를 인출하여 IR에 저장한다.

결과:

  • IR ← 8170 (JUMP 170)
  • PC는 아직 0103

[단계 8] JUMP 명령어 실행

  1. 8170 명령어를 해독한다.
    • JUMP 170이므로, PC 값을 170으로 변경하는 분기 명령어이다.
  2. PC를 170으로 변경하여 프로그램 실행 흐름을 변경한다.

결과:

  • PC ← 0170
  • 다음 명령어는 170번지에서 실행됨