CS/컴퓨터 구조론

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

devrabbit22 2025. 3. 20. 02:13
  • CPU의 기능은 명령어들에 의하여 결정된다. 명령어들의 종류와 수는 CPU마다 약간씩 다르다.
  • CPU를 위해 정의되어 있는 명령어들의 집합을 명령어 세트(Instruction set)라 한다. 

명령어 세트를 설계하기 위한 사항

  • 연산 종류(Operation repertoire) : CPU가 수행할 연산들의 수와 종류 및 복잡도
  • 데이터 유형(Data type) : 연산이 수행될 데이터들의 유형, 즉, 데이터의 길이(비트 수)와 수의 표현 방식(정수, 부동소수점 수 )등
  • 명령어 형식(Instructioon format) : 명령어의 길이, 오퍼랜드 필드들의 개수와 길이 등
  • 주소지정 방식(addressing mode) : 오퍼랜드의 주소를 지정하는 방식

연산의 종류

CPU가 수행할 수 있는 연산(혹은 동작)들의 종류는 컴퓨터에 따라 매우 다양하다. 

반드시 수행할 수 있어야 하는 기본 연산들

  • 데이터 전송 : 레지스터와 레지스터 간, 레지스터와 기억장치 간, 혹은 기억장치와 기억장치 간에 데이터를 이동하는 동작이다.
  • 산술 연산 : 덧셈, 뺄셈, 곱셈 및 나눗셈과 같은 기본적인 산술 연산들을 말한다. 이 연산들은 부호를 가진 정수들에 대해서는 물론이고, 부동소수점 수(floating-point number)에 대한 산술적 연산도 포함된다.
  •  논리 연산 : 데이터의 각 비트들 간에 대한 AND, OR, NOT 및 exclusive-OR 등과 같은 논리 연산을 수행한다.
  • 입출력(I/O) : CPU와 외부 장치들 간의 데이터 이동을 위한 동작들이 수행된다. 이를 위해서는 특수한 I/O 명령어들과 주소 지정 방식이 필요하다.
  • 프로그램 제어 : 명령어 실행 순서를 변경하는 연산들이 필요하다. 이 분류의 연산들로는 분기(branch)와 서브루틴 호출(subroutine call) 등이 있다. 
    이 연산들을 처리하기 위해서는 두 가지의 기본적인 명령어들이 필요하다.
    • CALL 명령어 : 서브루틴을 호출(call)하는 명령어
    • RET 명령어 : 서브루틴으로부터 원래 프로그램으로 복귀(return)시키는 명령어

서브루틴이 포함된 프로그램이 수행되는 순서

CALL/RET 명령어의 마이크로 연산

CALL X 명령어에 대한 마이크로-연산 
t0 : MBR ← PC
t1: MAR ← SP, PC ← X
t2: M[MAR] ← MBR, SP ← SP - 1

  • 현재의 PC 내용(서브루틴 수행 완료 후에 복귀할 주소)을 SP가 지정하는 스 택의 최상위(top of stack: TOS)에 저장
  • 만약 주소지정 단위가 바이트이고 저장될 주소는 16비트라면, SP ← SP – 2 로 변경

RET 명령어의 마이크로-연산

t0 : SP ← SP + 1
t1 : MAR ← SP
t2 : PC ← M[MAR]

수행 과정에서 스택에 저장되는 내용들

명령어 형식

명령어
명령어는 CPU에 의해 실행될 때 제공해야 할 모든 정보를 포함하고 있어야 함 = 구성요소

 

명령어의 구성요소들

  • 연산 코드(Operation Code)
    • 수행될 연산을 지정해준다. (예: LOAD, ADD 등)
  • 오퍼랜드(Operand)
    • 연산을 수행하는 데 필요한 데이터 혹은 데이터의 주소를 나타낸다.
    • 각 연산은 한 개 혹은 두 개의 입력 오퍼랜드들과 한 개의 결과 오퍼랜드를 가질 수 있다.
    • 데이터는 CPU 레지스터, 주기억장치, 혹은 I/O 장치에 위치한다.
  • 다음 명령어 주소(Next Instruction Address)  
    • 현재의 명령어 실행이 완료된 후에 다음 명령어를 인출할 위치를 나타낸다.
    • 분기 혹은 호출 명령어와 같이 실행 순서를 변경하는 경우에 필요하다.
  •  명령어 형식(instruction format)
    • 명령어를 구성하는 필드의 종류와 개수, 배치 방식 및 필드 당 비트수를 정의한 형식
  • 필드(field)
    • 명령어의 각 구성 요소들에 소요되는 비트들의 그룹
  •  명령어의 길이
    • 단어(word) 길이
    • ex) 세 개의 필드들로 구성된 16-비트 명령어

명령어 형식의 결정에서 고려항 사항들

연산 코드 필드 길이 : 연산의 개수를 결정
ex) 4비트→2^4 =16가지의연산정의가능
만약 연산 코드 필드가 5 비트로 늘어나면, 2^5 = 32 가지 연산들 정의 가능 → 다른 필드의 길이가 감소한다.

오퍼랜드 필드의 길이 : 오퍼랜드의 범위 결정

오퍼랜드의 종류에 따라 범위가 달라진다.

  • 데이터 : 표현 가능한 수의 범위 결정된다.
  • 기억장치 주소 : CPU가 오퍼랜드 인출을 위하여 직접 주소를 지정할 수 있는 기억장치 영역의 범위가 결정된다.
  • 레지스터 번호 : 데이터 저장에 사용될 수 있는 내부 레지스터들의 수가 결정된다.

오퍼랜드 필드 범위의 예

오퍼랜드1은 레지스터 번호를 지정하고, 오퍼랜드2는 기억 장치 주소를 지정하는 경우

  • 오퍼랜드1: 4비트→16개의레지스터사용가능
  • 오퍼랜드2: 8비트→기억장치의주소범위: 0∼255번지

두 개의 오퍼랜드들을 하나로 통합하여 사용하는 경우

  • 오퍼랜드가 2의 보수로 표현되는 데이터라면, 표현범위: -2048∼+2047
  • 오퍼랜드가 기억장치 주소라면, 2^12 = 4096 개의 기억장치 주소들 지정 가능

오퍼랜드 수에 따른 명령어 분류

1-주소 명령어(one-address instruction)

  • 오퍼랜드를 한 개만 포함하는 명령어 (다른 한 오퍼랜드는 묵시적으로 AC가 됨)
  • ex) ADD X                          ; AC<-AC + M[X]

2-주소 명령어(two-address instruction) 

두 개의 오퍼랜드를 포함하는 명령어

ex)  ADD R1, R2            ;R1 <- R1 + R2 
       MOV R1, R2           ;R1 <- R2 
       ADD R1,  X             ;R1 <- R1 + M[X] 

 

 3-주소 명령어(three-address instruction)

  • 세 개의 오퍼랜드들을 포함하는 명령어.
  • ex) ADD R1, R2, R3                   ; R1<-R2 + R3

1-주소 명령어의 예 

  • 길이가 16 비트인 1-주소 명령어에서 연산 코드가 5 비트인 경우의 명령어 형식을 정의하고, 주소지정 가능한 기억장치 용량을 결정하라

명령어 형식(instruction format)

주소지정 가능한 기억장치 용량 : 211 = 2048 바이트

 

2-주소 명령어의 예

2-주소 명령어 형식을 사용하는 16-비트 CPU에서 연산 코 드가 5 비트이고, 레지스터의 수는 8 개이다. (a) 두 오퍼랜드 들이 모두 레지스터 번호인 경우와, (b) 한 오퍼랜드는 기억 장치 주소인 경우의 명령어 형식을 정의하라

3-주소 명령어의 예

명령어 형식이 프로그래밍에 미치는 영향

명령어에 포함되는 오퍼랜드의 수에 따라 여러가지 명령어 형식들이 존재할 수 있는데, 이러한 형식은 프로그램의 길이에 직접적인 영향을 미친다. 

ex) X = (A + B) x (C - D) 계산을 위한 어셈블리 프로그램 작성

아래와 같은 니모닉을 가진 명령어들을 사용한다.

  • ADD :덧셈
  • SUB :뺄셈
  • MUL :곱셈
  • DIV : 나눗셈
  • MOV :데이터이동
  • LOAD :기억장치로부터데이터적재
  • STOR :기억장치로데이터저장

1-주소 명령어를 사용한 프로그램

LOAD A       ; AC ← M[A]
ADD B.        ; AC ← AC + M[B]
STOR T       ;M[T]←AC
LOAD C      ; AC ← M[C]
SUB D         ; AC ← AC - M[D]
MUL T        ; AC ← AC × M[T]
STOR X      ;M[X]←AC

  • 단, M[A]는 기억장치 A번지의 내용, T는 기억장치 내 임시 저장장소 의 주소
  • 프로그램의 길이 = 7 (7개 명령어 사용)

 

2-주소 명령어를 사용한 프로그램

MOV R1, A       ; R1 ← M[A]   
ADD R1, B        ; R1 ← R1 + M[B]
MOV R2, C       ; R2 ← M[C]
SUB R2, D        ; R2 ← R2 - M[D]
MUL R1, R2      ; R1 ← R1 × R2
MOV X, R1        ; M[X] ← R1

  • 프로그램의 길이 = 6 (레지스터 번호를 포함)

3-주소 명령어를 사용한 프로그램

ADD R1, A, B          ; R1 ← M[A] + M[B]

SUB R2, C, D         ; R2 ← M[C] - M[D]
MUL X, R1, R2       ; M[X] ← R1 × R2

  • 프로그램의길이= 3 (3개의명령어만으로가능)

단점

    • 3주소 명령어를 사용하면 프로그램이 가장 짧아진다는 장점이 있다. 그러나 레지스터의 수와 기억장치의 용량이 고정된 상태에서 이 명령어 형식을 사용하면 명령어 비트 수가 늘어나게 된다.
    • 결과적으로 프로그램의 길이는 줄어들지만 프로그램을 저장하기 위한 기억장치 용량은 별로 줄어들지 않으며, 명령어 해독 과정이 더 복잡해지는 단점도 있다.

Reference

컴퓨터 구조 개정 5판

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

 

[ 컴퓨터구조 ] 2.4 명령어 세트

[ 명령어 세트(instruction set) ] ▣ 명령어 세트란? ▪ CPU의 기능은 명령어들에 의해 결정 ▪ 명령어들의 종류와 수는 CPU마다 약간씩 다름 ▪ 명령어 세트 = 어떤 한 CPU를 위하여 정의되어 있는 명령

yz-zone.tistory.com