5.1 명령어 코드(Instruction Codes)


프로그램

  • 명령어들의 집합

기계명령어

  • 컴퓨터가 특정한 연산을 수행하도록 지시하는 비트 그룹들
  • 특정한 연산 = 마이크로 연산들

범용 컴퓨터

  • 프로그램이 실행되면 프로그램의 명령어를 읽어들이면서 필요한 데이터들을 읽어들여서 메모리에 저장한다.
  • CPU는 메모리에 있는 명령어를 읽어온다.
  • 그 명령어 들이 저장되는 곳은 명령어 레지스터(IR)이다.
  • 제어 장치의 제어 회로는 명령어들의 마이크로 명령어들의 나열로 번역을 해주게 된다. 그래서 프로그램은 마이크로 명령들의 나열이니까 이 것들이 실행되는 것이 컴퓨터 내에서 프로그램이 실행되는 것이다.

명령어 코드란?

  • 컴퓨터에게 어떤 특별한 동작을 수행할 것을 알리는 비트들의 집합으로서 여러개의 부분으로 나뉘어 지는데, 그 중 가장 기본적인 부부은 연산 코드 부분이다.
  • 연산코드는 가감승제나 시프트, 보수 등과 같은 동작을 정의한 비트들의 집합으로서 이 연산 코드 부분이 n비트로 구성되면 최대한 2^n개의 서로 다른 연산을 실행할 수 있다.

연산(operation)

  • 컴퓨터 메모리에 저장된 명령어의 일부로서 컴퓨터에게 특수한 연산을 실행하도록 명령하는 이진 코드이다.
  • 제어 장치는 메모리로부터 이러한 명령어를 받아서 연산 코드의 비트 부분을 해석하여 내부 컴퓨터 레지스터에 마이크로 연산을 실행하는 일련의 마이크로 연산을 발생시키게 되므로 하나의 연산 코드는 마이크로 연산의 집합으로 볼 수 있다.

컴퓨터 명령어는 두가지로 나뉜다.

  1. opcode는 명령어에 대한 연산을 구체화한다.

  2. 주소는 레지스터 and/or 위치를 나타낸다.

  • 컴퓨터의 가장 간단한 구성은 단 한 개의 프로세서 레지스터를 가짐으로써 두 개의 부분으로 구성된 명령어 코드를 사용하는 것이다. 이때 한 부분은 실행할 연산을, 그리고 다른 한 부분은 피연산자가 저장된 메모리내의 주소를 기술하게 되는데, 메모리로부터 읽혀진 피연산자 부분은 레지스터에 저장된 데이터와 연산을 실행하게 된다.
  • 12비트는 주소에, 4비트는 연산 코드에 할당함으로써 지정된 주소의 피연산자와 레지스터 사이에 마이크로 연산들이 실행되는데 이때 하나의 프로세서 레지스터를 누산기라고 부르며, AC로 표시한다.

간접 주소와 직접 주소

K-086

  • 피연산자의 내용이 담겨있는 메모리 주소를 나타내는 경우는 직접 주소
  • 주소의 내용을 담고 있는 장소의 주소를 저장하고 있는 메모리 워드의 주소를 간접 주소라고 부른다.
  • 보통의 경우 한 비틀르 사용해서 명령어 코드의 주소 부분이 직접 주소인지 간접 주소인지를 구별한다.

  • 위의 사진에서 모드 비트가 0이면 직접 주소를 나타내고 1이면 간접 주소를 나타낸다.

K-089

  1. 왼쪽 그림에서 직접주소 명령어는 메모리 주소 22에 놓여 있다. I비트는 0이고, 연산 코드는 ADD를 나타내며, 주소 부분은 457을 가리키고 있다. 따라서 이 명령어는 제어에 따라 주소 457의 피연산자의 읽기와 AC의 내용에 더하는 동작을 한다.
  2. 오른쪽 그림은 주소 35에 놓여 있으며, I비트는 1을 가리키고 있다. 따라서 이 명령어는 간접 주소를 사용하는 것으로 제어를 통해 주소 300에 접근하면 실제로 피연산자가 존재하는 주소를 얻을 수있는 것이다. 이 경우에 피연산자의 주소는 1350이 된다.

5.2 컴퓨터 레지스터

  • 컴퓨터 명령어는 보통 연속적인 메모리상에 위치하고 이것들이 하나씩 순차적으로 수행된다. 따라서 다음 수행될 명령어의 주소를 알아낼 수 있는 카운터 같은 장치가 필요하다. 또한 제어 장치내에는 메모리에서 읽어온 명령어 코드를 저장할 수 있는 레지스터와 데이터를 조작하기 위한 프로세서 레지스터, 그리고 메모리의 주소를 갖고 있는 레지스터가 필요하다.

K-090

  • 메모리 장치는 4096 워드로 구성되어 있으며, 각 워드는 16비트이다. 즉 피연산자의 주소를 위해 12비트가필요하고, 3비트는 명령어 코드를 나타내며, 나머지 1비트가 직접 주소, 간접 주소를 구별하는데 사용된다.
  • 메모리에서 읽어온 명령어는 명령어 레지스터(IR)에 저장되고, 임시레지스터(TR)은 계산 도중의 임시 데이터를 저장한다.

  • 메모리 주소 레지스터(AR)와 프로그램 카운터(PC)는 메모리의 주소를 나타내어야 하므로 12비트로 구성되어 있다. PC의 내용이 카운트 순서에 따라 하나씩 증가함에 따라 명령어들은 분기 명령어를 만날때까지 순차적으로 수행된다.

  • 직접 또는 간접 주소 방식을 사용하여 피연산자가 발견되면 데이터 레지스터(DR)에 배치한다.
  • 기본 컴퓨터에는 하나의 누산기(AC)가 있다.
  • 범용 레지스터는 데이터와 주소를 모두 저장할 수있다.
  • 중간 결과나 기타 임시 데이터를 저장하기 위해 프로세서가 스크래치 레지스터를 필요로 하는 경우가 있는데, 기본 컴퓨터에서는 이것이 임시 레지스터(TR)라 한다.

  • 기본 컴퓨터는 매우 간단한 입/출력 연산 모델을 사용한다.
    • 입력 기기는 프로세서에 8비트 문자 데이터를 보낸다.
    • 프로세서는 출력 기기에 8비트 문자를 보낼 수 있다.
  • 입력 레지스터(INPR)은 입력 장치에서 얻은 8비트 문자를 가지고 있다.
  • 출력 레지스터(OUTR)은 출력 장치에 보낼 8비트 문자를 가지고 있다.

공통 버스 시스템

  • 기본 컴퓨터에는 레지스터들 사이나 레지스터와 메모리 사이에 정보 전송을 하기 위한 경로가 제공되어야 한다.

K-091

  • 기본 컴퓨터에 있는 레지스터들은 버스를 사용하기 위해 연결된다.

  • 이렇게 하면 레지스터 간의 회로가 절약된다.

  • 데이터 흐름

    • 레지스터 중 하나가 로드 신호를 활성화하거나 메모리에서 쓰기 신호를 활성화하여 버스의 데이터가 로드되는 위치를 결정합니다.
    • 12비트 레지스터, AR 및 PC는 고차 4비트 위치에서 버스에 0이 로드됩니다.
    • 버스에서 8비트 레지스터 OUTR을 로드하면 버스의 저차 8비트에서 데이터가 수신된다.

    • IR, OUTR은 병렬 부하가 있는 비트 레지스터이다.

K-095

  • 위와 같이 세개의 입력 신호에 따라 사용할 레지스터가 달라진다.

K-096

5.3 컴퓨터 명령어


K-097

  • 명령은 12비트를 주소지정에 사용하고, 주소 모드 I를 위해 맨 왼쪽의 한 비트를 사용한다. 레지스터 참조 명령어는 연산 코드가 111이고 최상위 비트는 0으로 되어 있으며, 주로 AC 레지스터에 대한 연산을 지정한다. 입출력 명령어는 연산 코드에 111, 최상위 비트에는 1을 가진다.

K-098

  • 명령은 12비트를 주소지정에 사용하고, 주소 모드 I를 위해 맨 왼쪽의 한 비트를 사용한다.
  • 레지스터 참조 명령어는 연산코드가 111이고 최상위 비트는 0으로 되어 있으며, 주로 AC 레지스터에 대한 연산을 지정한다.
  • 입출력 명령어는 연산코드에 111, 최상위 비트에는 1을 가진다. 이것은 레지스터 참조 명령어와 마찬가지로 메모리에 대한 참조가 필요 없고, 나머지 12비트를 입출력 연산의 종류를 나타내는 데 사용된다.

명령어 집합의 완전성

  • 컴퓨터는 사용자가 생각할 수 있는 모든 데이터 처리 작업을 수행할 수 있도록 충분한 명령어들을 갖고 있어야 하는데 이에 필요한 명령어의 종류들을 생가해보면 다음과 같다.
    1. 산술, 논리, 시프트 명령어
    2. 메모리와 프로세서 레지스터 사이에 정보를 이동시킬 수 있는 명령어
    3. 상태 조건을 검사하는 명령과 프로그램 제어 명령어
    4. 입력과 출력 명령어

5.4 타이밍과 제어


제어 장치(Control Unit)

  • 기본 컴퓨터의 모든 플립플롭과 레지스터는 주 클럭 발생기에 의하여 제어된다. 그러나 클럭 펄스만으로는 레지스터의 상태를 변경시킬 수 없고, 제어 장치에서 생성된 제어 신호가 Enable 시켜 주어야 한다.
  • 제어 장치는 하드와이어(hardwire) 제어방식과 마이크로 프로그램(microprogrammend) 제어 방식의 두 종류가 있다.
    • 하드 와이어 방식 : 게이트, 플립플롭, 디코더 등의 디지털 회로를 이용하여 제어 논리를 구현하기 때문에 속도면에서 유리하지만, 컴퓨터의 구조가 변경되었을 때 여러 부품들 사이의 배선까지 바꾸어 주어야 하는 단점이 있다.
    • 마이크로 프로그램 방식 : 제어 메모리에 저장된 제어 정보를 이용하여 마이크로 연산을 순차적으로 수행시키기 때문에 설계가 변경되더라도 제어 메모리의 마이크로 프로그램만 갱신해주면 된다.

K-099

타이밍 신호

  • 4비트 시퀀스 카운터(SC)와 4x16 디코더에 의해 생성된다.
  • SC는 증가되거나 클리어될 수 있다.
  • 예) T0, T1, T2, T3, T4, T0, T1 …
  • 가정 : T4시간에, 만약 디코더 출력 D3가 활성화되면 SC는 0으로 초기화 된다.

K-100

5.5 명령어 사이클(Instruction Cycle)


기본 컴퓨터에서 각 명령어 사이클은 다음과 같은 단계들로 이루어져 있다

  1. 명령어를 메모리에서 가져온다(fetch)
  2. 명령어를 디코딩한다
  3. 간접 주소 방식의 명령어일 경우에 메모리로부터 유효 주소를 읽어온다.
  4. 명령어를 실행한다.

네 번째 단계가 끝나면 다시 첫 번째 단계로 돌아가 다음 명령어에 대한 fetch, 디코드, 실행 단계를 반복한다. 이러한 반복은 HALT 명령을 만날 때까지 계속하여 반복한다.

Fetch와 디코드

초기에 프로그램 카운터(PC) 는 프로그램의 첫 명령어에 대한 주소를 가지고 있으며, 순차 카운터(SC)는 0으로 타이밍 변수 T0를 가리킨다. 다음에 매 클럭마다 타이밍 변수는 T0, T1, T2와 같은 순서로 변한다.

  • 초기 값
    • PC = 프로그램 내 첫 명령 주소
    • SC = 0, timming signal = T0
  • Micro-operations for the fetch and decode phases
    • fetch
      • T0 : AR ← PC (bus←PC, AR←bus)
      • T1 : IR ← M[AR], PC ← PC + 1
    • decode
      • T2 : D0, … D7 ← Decode IR(12-14), AR ← IR(0-11), I←IR(15)

여기서 AR 레지스터만이 메모리의 주소 입력에 연결되어 있으므로, T0시간 동안 PC에서 AR로의 데이터 전송이 필요하다. 메모리에서 읽어온 명령어는 T1에 해당하는 클럭 변이에서 명령어 레지스터(IR)에 저장된다. 동시에 다음 명령어의 주소를 위해 PC가 하나 증가된다. 시간 T2에서는 IR의 연산 코드 부분이 디코드되고, 간접 비트가 플립플롭 I에 전해지며, 주소 부분은 AR로 전송된다.

명령어 종류의 결정

K-102

위 흐름도에서 명령어 사이클의 초기 구성을 보여주고 있다.

  • 디코더 출력 D7이 1이면 디코딩된 명령어는 레지스터 참조이거나 입출력 명령어임을 알 수 있다.
  • D7=0이면 연산 코드는 000에서 110중의 하나로 메모리 참조 명령어임을 나타낸다. 다음에 플립플롭 I의 값을 검사하게 되는데 D7=0이고 I=1이라면 간접 주소 방식을 나타내기 때문에 메모리에서 유효 주소를 읽어와야 한다.

레지스터 참조 명령어

  • 레지스터 참조 명령어는 D7=1이고 I=0인 명령어로, IR(0-11)에 있는 나머지 12비트로 12가지 명령어를 나타낸다.

K-103

5.6 메모리 참조 명령어(Memory Reference Instructions)


  • 어떤 명령어의 유효 주소가 AR에 저장되어 있다. I=0일 때 타이밍 신호 T2 시점에 AR의 유효 주소가 저장되게 된다. 만약 I=1이면 타이밍 신호 T3인 시간대에 AR에 유효 주소가 저장되게 된다.

  • 메모리 참조 명령이 실행되는 시간은 T4이다.

  • 메모리 사이클이 CPU 사이클이 완성되는 거보다 짧다고 가정해야한다.
    • CPU가 연산을 한번 취하는것을 CPU 사이클이라 했을 때, CPU가 연산되는 동안 어떤 연산에 필요한 데이터가 메모리로부터 전달되야 하는데 메모리로 부터 전달되는 과정이 CPU가 필요할 때 갖다 줄 수 있도록 메모리 사이클이 충분히 빠르다고 가정하고 가자.
  • 메모리에 저장된 데이터는 AC에서 직접적으로 다가가서 처리할 수 없다. 왜? 101p 그림 참조 메모리에 있는 데이터가 버스로 전달된다. 데이터 레지스터로 전달되게 되는데 이 데이터 레지스터도 버스로 데이터를 전달할 수 있다. AC에서 데이터를 가져오는게아니고 ALU로부터 데이터를 가져와서 동작한다.ALU에 있는 데이터는 AC로부터 오거나 DR로부터 온다.

K-104

  • 메모리 참조 명령어는 마이크로 연산들의 나열로 이루어져야 한다.

AND 명령어

  • D0=1 일때 실행된다.
  • AC에 메모리 워드에 해당하는 값을 AND 연산하여 결과를 저장한다.
  • 기호 : AC ← AC ^ M[AR]
  • K-105

ADD 명령어

  • AC에 ADD 연산을 한다.
  • D1 = 1 일 때 실행된다.

K-106

  • E = ALU에서 AC로 데이터를 전달하는 과정에서 0 또는 1에 해당하는 값만 저장

LDA 명령어

  • 메모리로부터 AC를 로드하는 과정
  • 기호 : AC ← M[AR]
  • D2=1, T4=1 일 때 DR←M[AR]
  • D2=1, T5=1 일 때, AC←DR, SC←0

STA 명령어

  • AC의 내용을 메모리에 저장한다.
  • 기호 : M[AR]←AC
  • D3=1 T4=1 일 때, M[AR]←AC, SC←0

BUN 명령어

  • 무조건 분기한다. (어떠한 특정 명령어로 jump 한다.)
  • D4=1, T4=1일 때, PC←AR, SC←0

BSA 명령어

  • D5=1일 때 실행된다.
  • 복귀할 주소값을 저장하는 동작을 한다.
  • 기호 : M[AR] ← PC, PC←AR+1

K-107

ISZ 명령어

  • 하나 증가시키고 0이면 스킵한다.
  • D6=1 일 때 실행된다.
  • 기호 : M[AR]← M[AR]+1, if M[AR]+1=0 then PC← PC+1

K-108

5.7 입출력과 인터럽트


입출력 구성

  • 터미널 장치는 컴퓨터에서 어떤 직렬 정보들을 보내고 받는 역할을 수행한다.-

  • 터미널 장치는 입출력 장치다. 입출력 장치는 직렬 정보를 보내고 받는다.
  • 키보드의 직렬 정보가 INPR(입력 레지스터)에 시프트된다.
  • 프린터의 직렬 정보가 OUTR에 저장된다.
  • 두 개의 레지스터가 통신 인터페이스와는 직렬로, AC와는 병렬로 통신한다.
  • 플래그는 입력 장치와 컴퓨터 사이에 다른 타이밍 속도를 동기화하기 위해 필요하다.

K-109

정보의 전송 과정

  1. FGI가 클리어 되고 키를 쳤을 때 8비트 코드가 INPR에 시프트 된 후 FGI는 1로 set된다.
  2. 플래그가 set되어 있는 동안은 다른 키를 쳐서 INPR에 있는 정보를 변경할 수 없다.
  3. 컴퓨터는 플래그를 체크하여 1이면 INPR로부터 AC로 병렬 전송을 하고 FGI를 clear 시킨다.
  4. FGI가 클리어 되면 새로운 정보가 INPR에 시프트 될 수 있다.

K-110

정보의 출력 과정

  1. FGO가 1로 set되고 컴퓨터는 FGO를 체크하여 1이면 OUTR로 정보를 병렬 전송한다.
  2. FGO를 클리어 시키면 출력 장치는 OUTR로부터 정보를 가져가고 해당 되는 문자를 프린트 한후 FGOㄹ르 1로 set 시킨다.
  3. FGO=0이면 컴퓨터는 OUTR에 새로운 정보를 넣지 못한다.

입출력 명령어

  • 입출력 명령어는 AC 레지스터로 정보를 전송하고, 플래그 비트를 검사하며, 인터럽트를 제어하는 기능을 가지고 있다.

인터럽트란?

  • 프로그램 처리 중에 CPU로 하여금 순차적인 명령어 실행을 중단하고 다른 프로그램을 처리하도록 요구할 수 있는 메커니즘
  • 주 프로그램의 관점에서 볼 때 정상적인 프로그램 처리의 흐름을 방해하는 동작이나, 긴급한 상황에 대처하거나 외부 장치들과의 상호 작용을 위해 반드시 필요한 기능

인터럽트 서비스 루틴?

  • CPU가 어떤 프로그램을 순차적으로 수행하는 도중에 외부로부터 인터럽트 요구가 들어오게 되면, CPU는 원래의 프로그램 수행을 중단하고 요구된 인터럽트를 처리해주기 위한 프로그램을 먼저 수행한다. 인터럽트에 대한 처리가 끝나면 CPU는 원래의 프로그램으로 복귀(return)하여 그 수행을 계속한다.

프로그램 인터럽트

  • 이상과 같이 플래그를 사용한 통신 방법을 프로그램 제어 전송이라고 하는데 이것은 프로세서와 입출력 장치와의 속도 차이 때문에 매우 비능률적이다.
    • 예를 들어 컴퓨터가 10us 동안 fetch와 실행 사이클을 수행하고 입출력 장치가 초당 10개의 문자를 처리할 수 있다면 입출력 장치는 1개의 문자 처리에 100000us의 시간이 필요하므로 매 전송시 5000번의 플래그 체크가 필요하게 된다. 이것은 대부분의 시간을 쓸데없이 낭비하는 결과를 낳기 때문에 다른 방법을 생각해 보아야 한다.
  • 프로그램 제어 전송 대신에 외부 장치가 전송 준비가 되어 있을 때 컴퓨터에게 그것을 알리는 방법이 있다.
  • 컴퓨터는 프로그램을 실행하는 동안에 플래그를 체크하지 않으며 플래그가 set 되면 컴퓨터는 현재 실행하고 있는 프로그램을 즉각 중지하고 프래그가 set되었다는 정보를 받아들여 입출력을 실행하게 된다.
  • 실행이 끝나면 다시 인터럽트 이전에 실행하던 프로그램을 계속 실행하는데 이러한 인터럽트 처리과정에 필요한 것이 인터럽트 인에이블 플립플롭(IEN)이다.
  • IEN은 명령어에 의해 set되거나 clear될 수 있다. 클리어 되면 플래그는 컴퓨터를 인터럽트 시킬 수 없게 되며 IEN이 세트될 때만 인터럽트를 걸 수 있다.

인터럽트 사이클

  • 인터럽트 플립플롭 R은 IEN=1이고 FGO나 FGI가 1일 때, 1로 set된다. 이것은 타이밍신호 T0, T1, T2 외의 어떤 시간에서도 수행되며, 지스터 전송문으로 나타내면 다음과 같다.
T0` T1` T2` (IEN)(FGI+FGO) : R ← 1

5.8 컴퓨터에 대한 완전한 기술


  • 컴퓨터 연산의 흐름도

K-111