CS/컴퓨터 구조론

컴퓨터 구조론 2장 [CPU의 구조와 기능 - 명령어 실행]

devrabbit22 2025. 3. 12. 02:16
  • CPU는 기억장치에 저장됭어 있는 명령어들을 인출하여 실행함으로써 실제적인 작업을 수행한다.
  • CPU 가 한 개의 명령어를 실행하는데 필요한 전체 과정 : 명령어 사이클(Instruction Cycle)
  • 명령어 사이클은 인출단계와 명령어 실행 단계로 나누어진다.
  • CPU가 기억장치로부터 명령어를 읽어오는 명령어 인출(Instruction fetch)
  • 인출된 명령어를 실행하는 명령어 실행(Instruction execution)

이 두 단계를 각각 부사이클(subcycle)로 구분하여 명령어 사이클의 흐름도를 보면 그 부사이클은 각각 인출 사이클과 실행 사이클이라 부른다.

기본 명령어 사이클

명령어 사이클은 CPU가 프로그램 실행을 시작한 순간부터 전원을 끄거나 회복 불가능한 오류가 발생하여 중단될 때까지 반복하여 수행된다.

 

명령어를 실행하기 위해 기본적으로 필요한 CPU 내부 레지스터

  1. 프로그램 카운터(Program Counter : PC)
    • 다음에 인출될 명령어의 주소를 가지고 있는 레지스터이다.
    • 각 명령어가 인출된 후에는 그 내용이 자동적으로 1(혹은 명령어 길이에 해당하는 주소 단위의 수만큼)이 증가되며, 분기(Branch) 명령어가 실행되는 경우 그 목적지 주소로 갱신된다.
  2. 누산기(Accumulator : AC)
    • 데이터를 일시적으로 저장하는 레지스터
    • 레지스터의 비트 수는 CPU가 한 번에 연산 처리할 수 있는 데이터 비트의 수, 즉 단어의 길이와 같다.
  3. 명령어 레지스터(Instruction Register : IR)
    • 가장 최근에 인출된 명령어가 저장되어 있는 레지스터
  4. 기억장치 주소 레지스터(Memory Address Register : MAR)
    • 프로그램 카운터(PC)에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터
    • 레지스터의 출력 선들이 주소버스 선들과 직접 접속된다.
  5. 기억장치 버퍼 레지스터(Memoryy Buffer Register : MBR)
    • 기억장치에 저장될 데이터 혹은 기억장치로부터 읽현진 데이터가 일시적으로 저장되는 버퍼 레지스터.
    • 레지스터의 입력 및 출력 선들은 데이터 버스 선들과 직접 접속된다.
  • 기억장치로부터 인출된 명령어는 MBR을 경유하여 IR에 저장되며, 실행 사이클에서 제어 유니트로 보내져 해독된다. 
  • MAR은 CPU 내부 주소 버스와 시스템 주소 버스 사이에서 버퍼(일시적 저장 장소) 역할을 하는 레지스터이며, MBR은 데이터에 대하여 같은 역할을 하는 버퍼 레지스터이다.
  • 기억장치로부터 인출된 데이터는 MBR을 통하여 AC로 적재된다.
  • 만약 명령어가 그 데이터에 대하여 산술 혹은 논리 연산을 수행하는 것이라며 AC의 내용이 ALU로 보내진다. 그리고 ALU의 결과는 다시 AC에 저장된다.

주요 레지스터들과 데이터 통로가 표시된 CPU 내부 구조

인출 사이클

  • CPU는 각 명령어 사이클의 시작 단계에서 프로그램 카운터(PC)가 가리키는 기억장치의 위치로부터 명령어를 인출해 온다. 그런 다음 CPU는 PC의 내용을 1씩 증가시킴으로써 명령어들을 기억장치에 저장되어 있는 순서대로 읽어올 수 있도록 해준다. 
  • ex) PC의 내용이 "215"라고 가정 -> 명령어 사이클이 시작되면 CPU는 기억장치의 215번지에 저장되어 있는 명령어를 인출해오며, PC의 내용을 '216'으로 증가시킨다. 그러면 다음 명령어 사이클에서는 216번지의 명령어가 인출된다. 이와 같으 은 과정이 반복되어 PC의 내용ㅇ튼 217, 218, 219, ... 로 계속 증가히게 되며, CPU는 그 위치들로부터 차례대로 명령어들을 인출하게 된다.

 

기억장치의 지정된 위치로부터 명령어를 읽어오는 과정 : 인출 사이클

인출 사이클에서 각 단계별로 수행되는 동작 : 마이크로-연산(Micro-Operation) -> CPU 클록의 각 주기동안 수행되는 기본적인 동작

인출 사이클의 각 단계별로 수행되는 마이크로 연산 표현

  • t0 : MAR <- PC 
  • t1 : MBR <- M[MAR], PC <- PC + 1
  • t2 : IR <- MBR

t0, t1  t2  CPU 클록(clock)의 주기

첫번째 주기 : 현재의 PC 내용을 CPU 내부 버스를 통하여 MAR로 전송

두번째 주기 : 그 주소가 지정하는 기억장치 위치로부터 읽혀진 명령어가 데이터 버스를 통 하여 MBR로 적재되며, PC의 내용에 1을 더한다

세번째 주기 : MBR에 있는 명령어 코드가 명령어 레지스터인 IR로 이동

 ex) CPU 클록 주파수 = 1GHz (클럭 주기 = 1ns) → 인출 사이클 : 1ns x 3 = 3ns 소요

인출 사이클에서의 주소 및 명령어 흐름도

실행 사이클

CPU가 명령어를 해독하고 그 결과에 따라 필요한 연산들을 수행하는 과정

  1. 데이터 이동 : CPU와 기억장치 간 혹은 CPU 와 I/O 장치 간에 데이터를 이동한다.
  2. 데이터 처리 : 데이터에 대하여 산술 혹은 논리 연산을 수행한다.
  3. 데이터 저장 : 연산결과 데이터 혹은 입력장치로부터 읽어들인 데이터를 기억장치에 저장한다.
  4. 프로그램 제어 프로그램의 실행 순서를 결정한다.

실행 사이클에서 수행되는 마이크로-연산들은 명령어의 연 산 코드(op code)에 따라 결정된다.

 

기본적인 명령어 형식의 구성 

연산 코드(operation code) 

  • CPU가 수행할 연산을 지정

오퍼 랜드(operand)

  • 명령어 실행에 필요한 데이터가 저장된 주소(addr)

Load addr 명령어

기억장치에 저장되어 있는 데이터를 CPU 내부 레지스터인 AC로 적재(load)(이동)하는 명령어

t0 : MAR ← IR(addr) 
t1 : MBR ← M[MAR] 
t2 : AC ← MBR

  • 첫번째 주기 : 명령어 레지스터 IR에 있는 명령어의 주소 부분을 MAR로 전송 
  • 두번째 주기 : 그 주소가 지정한 기억장소로부터 데이터를 인출하여 MBR로 전송 
  • 세번째 주기 : 그 데이터를 AC에 적재

인출 사이클의 주소 및 명령어 흐름도

STA addr 명령어

AC 레지스터의 내용을 기억장치에 저장하는 명령어

t0 : MAR ← IR(addr)
t1 : MBR ← AC
t2 : M[MAR] ← MBR

  • 첫번째 주기 : 데이터를 저장할 기억장치의 주소를 MAR로 전송
  • 두번째 주기 : 저장할 데이터를 버퍼 레지스터인 MBR로 이동 
  • 세번째 주기 : MBR의 내용을 MAR이 지정하는 기억장소에 저장

 

ADD addr 명령어

기억장치에 저장된 데이터를 AC의 내용과 더하고, 그 결과는 다시 AC에 저장하는 명령어

t0 : MAR ← IR(addr)
t1 : MBR ← M[MAR] 
t2 : AC ← AC + MBR

  • 첫번째 주기 : 데이터를 저장할 기억장치의 주소를 MAR로 전송
    두번째 주기 : 저장할 데이터를 버퍼 레지스터인 MBR로 이동
    세번째 주기 : 그 데이터와 AC의 내용을 더하고 결과값을 다시 AC에 저장

ADD 명령어 실행 사이클 동안의 정보 흐름

JUMP addr 명령어

오퍼랜드(addr)가 가리키는 위치의 명령어로 실행 순서를 변경하는 분기(branch) 명령어

t0 : PC ← IR(addr)

  • 명령어의 오퍼랜드(분기할 목적지 주소)를 PC에 저장
  • 다음 명령어 인출 사이클에서 그 주소의 명령어가 인출되므로, 분기가 발생한다.

 

어셈블리 프로그램의 실행 과정

연산 코드에 임의의 정수 배정

LOAD : 1

STA : 2

ADD : 5

JUMP : 8

어셈블리 프로그램의 예

1단계

  • PC가 첫 번째 명령어의 주소인 100을 가지고 있다. 
  • 이 주소의 내용인 첫 번째 명령어 코드가 인출되어 명령어 레지스터 IR에 저장된다.
  • MAR, MBR도 사용된다.

 

2단계

  • 100번지의 첫 번째 명령어 코드가 인출되어 IR에 저장
    250 번지의 데이터를 AC로 이동
  • PC = PC + 1 = 101

3단계

  • 두 번째 명령어가 101번지로부터 인출되어 IR에 저장

 

4단계

  • AC의 내용과 251 번지의 내용이 ALU로 보내져서 더해지고, 결과를 AC에 저장
  • PC의 내용은 102로 증가

5단계

  • 세 번째 명령어가 102 번지로부터 인출되어 IR에 저장

6단계

  • AC의 내용을 251 번지에 저장
  • PC의 내용은 103으로 증가

7단계

  • 네 번째 명령어가 103 번지로부터 인출되어 IR에 저장된다.

8단계

  • 분기될 목적지 주소, 즉 IR의 하위 부분(170)이 PC로 적재 (다음 명령어 인출 사이클에서는 170 번지의 명령어 인출)

인터럽트 사이클

인터럽트(Interrupt)

  • CPU로 하여금 현재 진행중인 프로그램 처리를 중단하고 다른 프로그램을 처리하도록 요구하는 매커니즘으로서, CPU와 외부 장치들 간의 상호작용을 위하여 필요한 기능
  • 주 프로그램(main program)의 관점에서 볼 때 단순히 정상적인 프로그램 처리의 흐름을 방해하는 동작
  • 인터럽트는 정전과 같은 긴급한 상황에 대처하거나 외부 장치들과의 상호 작용을 위하여 반드시 필요한 기능

 

CPU가 어떤 프로그램을 순차적으로 수행하는 도중 외부로부터 인터럽트 요구가 들어오게 되면, CPU는 원래의 프로그램 수행을 중단하고, 요구된 인터럽트를 처리해주기 위한 프로그램을 먼저 수행한다.

인터럽트 서비스 루틴(Interrupt service routine : ISR)

  • 인터럽트 요구를 처리해주기 위해 수행하는 프로그램 루틴
  • 인터럽트에 대한 처리가 끝나면, CPU는 원래의 프로그램으로 복귀(return)하여 그 수행을 계속한다.

인터럽트에 의한 제어의 이동

CPU는 인터럽트 요구가 들어오면 그것을 인식할 수 있어야 하며, 어떤 장치가 인터럽트를 요구하였는지 확인하여 해당 인터럽트 서비스 루틴을 수행하고, 중단하였던 원래 프로그램의 수행을 계속할 수 있어야 한다.

CPU는 각 명령어의 실행 사이클을 종료하고 다음 명령어를 위한 인출 사이클을 시작하기 전에, 인터럽트 요구 신호가 들어와서 대기 중인지 검사해야 한다.

인터럽트 요구가 들어왔을 때 CPU가 수행하는 동작

  1. 다음에 실행할 명령어의 주소를 가리키는 현재의 PC 내용을 스택(STACK)에 저장한다. 이것은 인터럽트 처리를 완료한 후에 복귀할 주소를 저장해두기 위한 절차이다.
  2. 해당 인터럽트 서비스 루틴을 호출하기 위해, 그 루틴의 시작 주소를 PC에 적재한다. 이때 시작 주소는 인터럽트를 요구한 장치로부터 전송되거나 미리 정해진 값으로 결정된다.

인터럽트 사이클(Interrupt Cycle)

  • 인터럽트 요구가 들어왔는지 검사하고, 그 처리에 필요한 동작들을 수행하는 과정
  • 즉, 현재의 PC 내용을 스택에 저장한 다음에, PC에 해당 ISR의 시작 주소를 적재하는 과정이다.

인터럽트 사이클이 추가된 명령어 사이클

유의사항

  • CPU가 인터럽트 사이클을 시작하기 전에, 인터럽트가 가능한 상태로 세트되어 있는지를 먼저 확인해야한다.
  • 만약 중요한 프로그램이 실행되는 중이라서 CPU가 인터럽트를 받지 못하도록 세트되어 있는 경우라면, 인터럽트 사이클은 수행되지 않는다.
  • 그렇지 않은 경우, CPU는 항상 인터럽트 사이클을 수행한다.
  • 인터럽트를 받을 수 있는 상태 : 인터럽트 가능(Interrupt enabled) 상태
  • 인터럽트를 받을 수 없는 상태 : 인터럽트 불가능(Interrupt disabled) 상태
  • 이 상태들은 CPU가 해당 명령어(EI 혹은 DI 명령어)를 수행함으로써 변경시킬 수 있다.

 

인터럽트 요구가 들어온 경우, 인터럽트 사이클 동안 수행되는 동작을 마이크로-연산으로 표현한 결과

t0 : MBR ← PC
t1 : MAR ← SP, PC ← ISR의 시작 주소
t2 : M[MAR] ← MBR, SP←SP - 1

  • SP는 CPU 내부에 있는 특수 목적용 레지스터들 중 하나인 스택 포인터(Stack Pointer)를 의미하는데, 그 내용은 항상 스택의 최상위(Top Of Stack :TOS)의 주소를 가리킨다.
  • 일반적으로 스택으로는 주기억장치의 끝부분이 사용되기 때문에, SP의 초깃값은 주기억장치의 마지막 주소로 세트된다. 
  • 인터럽트 사이클의 첫번째 주기에서는 PC의 내용이 MBR로 보내진다.
  • 두번째 주기에서는 SP의 내용이 MAR을 통하여 주소 버스로 나가게 되며, PC에는 인터럽트 서비스 루틴의 시작 주소가 적재된다.
  • 마지막 주기에서는 MBR에 저장되어 있던 원래의 PC 내용을 스택에 저장하며, 동시에 SP의 내용을 1 감소시켜 TOS의 주소를 수정한다

 

인터럽트 사이클이 종료되어 다음 인출 사이클이 시작되면, CPU는 인터럽트 서비스 루틴의 첫 번째 명령어부터 인출하면서 인터럽트 요구에 대한 서비스를 시작하게 된다.

 

ex) 인터럽트 사이클의 마이크로 연산

프로그램의 첫 번째 명령어인 LOAD 250 명령어가 실행되는 동안에 인터럽트가 들어왔으며, 현재 SP = 999이고, 인터럽트 서비스 루틴의 시작 주소는 650 번지라고 가정한다.

 

100 LOAD 250
101 ADD 251
102 STA 251
103 JUMP 170

인터럽트 요구가 들어온 경우의 상태 변화

유의사항

LOAD 명령어가 실행된 결과로서 기억 장치 250번지의 내용인 0004가 AC 레지스터에 적재되어 있는데, 만약 인터럽트의 서비스 루틴이 수행되는 동안에 AC의 내용이 바뀌게 되면 나중에 원래의 프로그램 실행으로 돌아왔을 때 다음 명령어인 ADD 명령어의 실행 결과가 틀리게 된다.

이러한 문제점을 해결하기 위한 방법

인터럽트 서비스 루틴의 시작 단계에서 레지스터들의 내용을 스택에 저장했다가, 루틴의 마지막 단계에서 원래 프로그램으로 복귀하기 직전에 다시 그들을 복원(restore)시켜 주는 절차가 필요하다.

 

다중 인터럽트(Multiple Interrupt)

  • 인터럽트 서비스 루틴을 수행하고 있는 동안에 다른 장치로부터 인터럽트가 들어오는 경우
  • 즉, 어떤 외부 장치를 위한 인터럽트 서비스 루틴의 명령어들이 실행되고 있는 동안에 다른 외부장치가 인터럽트 요구를 발생할 수도 있는데 이를 다중 인터럽트라 한다.

다중 인터럽트를 처리하는 방법

  1. CPU가 인터럽트 서비스 루틴을 처리하고 있는 도중에는 새로운 인터럽트 요구가 들어와도 인터럽트 사이클을 수행하지 않도록 하는 것이다. 즉, 인터럽트 불가능 상태일 때는 CPU가 인터럽트 요구 신호를 검사하지 않도록 한다. 이렇게 되면, 그 루틴을 처리하는 동안에 발생한 인터럽트 요구는 대기 상태로 남아있다가, CPU가 다시 인터럽트 가능 상태로 바뀐 후에 인식된다.
  2. 인터럽트 요구들 간에 우선순위를 정하고, 우선순위가 낮은 인터럽트 요구를 처리하고 있는 동안에 우선 순위가 더 높은 인터럽트 요구가 들어오면, 현재의 인터럽트 서비스 루틴의 수행을 중닿나고 새로운 인터럽트를 처리하도록 하는 것이다. 이 경우 PC의 내용을 저장하고 갱신하는 절차는 단일 인터럽트의 경우와 동일하다. 그러나 스택에는 원래의 주 프로그램으로 복귀하기 위한 주소뿐 아니라, 첫 번째 인터럽트 서비스 루틴으로 복귀하는데 사용될 주소도 저장되어야 한다.

우선 순위가 더 높은 장치로부터 인터럽트 요구가 들어와 먼저 처리되는 경우에 대한 전체적인 순서도

다중 인터럽트에서 프로그램이 실행되는 순서

간접 사이클

  • ADD 명령어와 같이 데이터에 대한 연산을 수행하는 경우 데이터가 기억장치에 저장되어 있다면, 명령어에는 그 데이터를 읽어오기 위한 기억장치 주소가 포함되어 있을 것이다. 
  • 어떤 명령어의 경우에는 포함하고 있는 주소가(데이터의 주소가 아니라) 데이터가 저장된 기억 장소의 주소를 가리킨다. 
  • 연산에서 사용도리 데이터의 주소가 기억장치의 어떤 위치에 저장되어 있고 명령어에 포함되어 있는 주소는 그 위치를 가리키고 있는 것이다. 이와 같은 경우에는 실행 사이클이 시작되기 전에, 그 데이터의 실제 주소를 기억장치로부터 읽어오는 과정이 먼저 수행되어야 한다.

간접 사이클  : 실행 사이클에서 사용될 데이터의 실제 주소를 기억장치로부터 읽어오는 과정

간접 사이클은 항상 수행되는 것이 아니며, 명령어 내의 특정 비트가 1로 세트된 경우에만 수행된다. 이는 간접 주소지정 방식(Indirect Addressing Mode)에서 사용된다.

 

간접 사이클에서는 마이크로-연산들이 수행된다.

즉, 인출사이클에서 읽혀져 IR에 적재되어 있는 명령어의 주소 필드를 다시 기억장치로 보내어서, 데이터의 실제 주소를 인출하여 IR의 주소 필드에 저장한다.

t0 : MAR ← IR(addr)
t1 : MBR ← M[MAR]
t2 : IR(addr) ← MBR


Reference

컴퓨터 구조론 개정 5판

https://liltdevs.tistory.com/125

 

CPU의 구조와 기능

CPU가 수행하는 동작들 명령어 인출 Instruction fetch 명령어 해독 Instruction decode 위 두 항목은 무조건 수행 데이터 인출 Data fetch 데이터 처리 Data process (산술적 연산) 데이터 저장 Data store 위 세 항목

liltdevs.tistory.com

 

https://yz-zone.tistory.com/66

 

[컴퓨터구조] 2.2 명령어 실행

▣ 명령어 사이클(instruction cycle) ▪ CPU가 한 개의 명령어를 실행하는 데 필요한 전체 과정 ▪ CPU가 프로그램 실행을 시작한 순간부터 전원을 끄거나 회복 불 가능한 오류가 발생하여 중단될 때까

yz-zone.tistory.com