본문 바로가기

CS/컴퓨터구조(김종현)

[컴퓨터구조] 명령어 실행 (명령어 인출, 실행 사이클)

김종현 컴퓨터구조론 개정5판 생능출판사, 김종상 컴퓨터시스템구조 제3판 프로텍미디어를 정리, 요약하여 올리는 글입니다.

 

1. 명령어 실행

출처 : 김종현 컴퓨터구조론 개정5판

    - CPU는 명령어가 저장된 기억장치에서 명령어를 인출해 실행하여 작업을 수행한다.

    - CPU가 한 개의 명령어를 실행하는 데 필요한 과정을 명령어 사이클(instruction cycle)이라고 한다. 이 명령어 사이클은 CPU 프로그램이 실행된 순간부터 전원을 끄거나 회복 불가능한 오류가 발생하여 중단되기 전까지 계속 반복된다.

    - 명령어 실행은 크게 두 부분으로 나뉜다. CPU가 기억장치로부터 명령어를 읽어오는 단계를 명령어 인출(instruction fetch), 명령어를 실행하는 단계를 명령어 실행(instruction excution)로 나뉜다. 

 

2. CPU 내부 레지스터

출처 : 컴퓨터구조론 개정5판

   2-1) 프로그램 카운터(Program Counter : PC) :

    다음에 인출된 명령어의 주소를 가지고 있는 레지스터이다. 명령어가 인출된 후에는 그 내용이 자동으로 1 증가한다(PC ← PC + 1). 분기(branch) 명령어가 실행되는 경우에는 그 목적지 주소로 갱신된다.

 

   2-2) 누산기(Accumulaor : AC) :

    데이터를 일시적으로 저장하는 레지스터이다. 이 레지스터의 비트 수는 CPU가 한 번에 연산 처리할 수 있는 데이터의 수 즉 단어(word) 길이와 같다.

 

   2-3) 명령어 레지스터(Instruction Register : IR) :

    가장 최근에 인출된 명령어가 저장되어 있는 레지스터이다. 

 

   2-4) 기억장치 주소 레지스터(Memory Address Regiter : MAR) :

    PC에 저장된 명령어 주소가 시스템 주소 버스로 실어가기 전에 임시적으로 저장되는 주소 레지스터이다. 이 레지스터의 출력 선들이 주소 버스 선들과 직접 접속된다.

 

   2-5) 기억장치 버퍼 레지스터(Memory Buffer Regiter : MBR) :

    기억장치에 저장될 데이터 혹은 기억장치로부터 읽혀진 데이터가 일시적으로 저장되는 버퍼 레지스터이다. 이 레지스터의 입력 및 출력 선들은 데이터 버스 선들과 직접 접속된다.

 

3. 인출 사이클

출처 : 컴퓨터구조론 개정5판

 

   - CPU가 명령어를 인출하는 단계이다. CPU는 각 명령어 사이클의 시작 단계에서 PC가 가리키는 기억장치의 위치로부터 명령어를 인출한다. 그 다음 PC를 1 증가하여 그 다음 명령을 순서대로 읽을 수 있도록 한다. 이 과정을 인출 사이클이라 한다. 

 

    - 인출 사이클에서 각 단계별로 수행되는 동작을 마이크로 연산으로 표현하면 다음과 같다.

     t0 : MAR ← PC 

     t0 : PC의 내용을 CPU 내부 버스를 통해 MAR로 보낸다. 시스템 주소 버스와 직접 접속된 MAR을 통해 주소가 메모리로 보내진다.

     t1 : MBR ← M[MAR], PC ← PC + 1 

     t1 : 주소가 지정하는 기억장치 위치로부터 읽혀진 명령어가 MBR에 적재되고 PC에 1을 더하여 PC는 다음 명령어를 가리킨다.

     t2 : IR ← MBR 

     t2 : MBR에 저장된 명령어 코드를 IR에 보낸다.

 

    - 여기서 t0, t1, t2는 CPU 클럭의 각 주기를 가리킨다. 명령어 인출에는 이 클럭 주기만큼 시간이 걸린다.

     예를 들어, CPU의 클럭 주파수가 1GHz라면 각 클록 주기는 1ns이다. 클럭이 3개이므로 1ns * 3 = 3ns가 소요된다. 

 

4. 실행 사이클

   - CPU가 명령어를 해독(decode)하고 그에 따른 연산을 수행하는 단계이다. 연산에는 다음과 같은 종류가 있다.

   (1) 데이터 이동 : CPU와 기억장치 간 혹은 CPU와 I/O 장치 간 데이터 이동

   (2) 데이터 처리 : 데이터에 대한 산술 혹은 논리 연산을 수행

   (3) 데이터 저장 : 연산 결과 데이터 혹은 입력장치로부터 읽어들인 데이터를 기억장치에 저장

   (4) 프로그램 제어 : 프로그램 실행 순서를 결정

   - 명령어는 연산 코드(operation code) + 오퍼랜드(addr) 로 구성되어 있다.

    연산 코드에 CPU가 해야 할 연산이 지정되고 오퍼랜드에 명령어가 사용할 데이터가 저장되어 있는 기억장치 주소를 가리킨다. 네 가지의 연산에 해당하는 명령어를 예시를 들어서 설명해보면 다음과 같다.

   - 실행 사이클의 모든 명령의 시작은 IR에 적재된 명령어를 꺼내면서 시작한다. 인출 사이클의 마지막에 IR에 명령어가 적재되어 있기 때문이다.

 

4-1) 데이터 이동 : LOAD addr

     t0 : MAR ← IR(addr) 

     IR에 적재된 명령어의 오퍼랜드인 주소를 MAR를 통해 기억장치로 보낸다.

     t1 : MBR ← M[MAR] 

     그 주소가 지정하는 기억 장소로부터 데이터를 인출하여 MBR에 저장한다.

     t2 : AC ← MBR 

     MBR에 저장된 데이터를 AC 레지스터에 적재하여 LOAD 명령이 완료된다.

 

4-2) 데이터 저장 : STA addr

    t0 : MARIR(addr) 

   데이터를 저장할 기억 장소의 주소를 MAR로 보낸다.

    t1 : MBR ← AC 

   저장할 데이터를 버퍼 레지스터인 MBR에 보낸다. 이렇게 하여 저장할 주소 위치와 저장할 데이터가 모두 기억장치로 보내졌다.

    t2 : M[MAR] ← MBR 

   그 주소가 지정하는 기억 장소에 데이터가 저장된다.

 

4-3) 데이터 처리 : ADD addr

   다양한 데이터 처리 산술 연산이 있지만 add 연산을 예로 들어보면 다음과 같다. add 연산은 AC 레지스터에 있는 내용과 기억장치에 저장된 데이터를 합해서 다시 AC 레지스터에 저장하는 것이다.

   t0 : MAR IR(addr) 

   명령어의 오퍼랜드를 주소 버스를 통하여 기억장치고 보낸다.

   t1 : MBR M[MAR] 

   해당 기억 장소로부터 데이터를 인출하여 MBR에 적재한다.

   t2 : AC AC + MBR 

   그 데이터와 AC 레지스터의 내용을 더하고, 결과값을 다시 AC 레지스터에 저장한다.

 

4-4) 프로그램 제어 : JUMP addr

   일반적으로 명령어들은 기억장치에 저장되어 있는 순서대로 실행된다. PC가 1씩 증가하면서 다음 명령을 실행하는 것이다. 명령어의 실행 순서를 결정하는 별도의 명령어가 필요하지 않다. 그런데 전혀 다른 위치에 있는 명령어를 실행해야 할 경우에는 프로그램 수행 순서를 조정해주는 동작이 필요하다. 따라서 현재 PC 내용이 가리키는 위치가 아닌 다른 위치의 명령어로 실행 순서를 바꾸도록 해주는 명령어를 분기(branch) 명령이라고 한다.

 

  t0 : PC IR(addr) 

여기의 오퍼랜드는 분기 목적지 주소를 가리키기 때문에 실행 사이클에서는 그 주소를 PC로 적재하기만 하면 된다. 그러면 다음 명령어 인출 사이클에서는 그 주소가 가리키는 기억 장소로부터 명령어가 인출되므로 명령어 실행 순서가 바뀐다.