본문 바로가기
Computer Science/컴퓨터 구조

명령어 세트(Instruction Set)

by Luinesse 2024. 1. 4.
반응형

명령어 세트

명령어 세트란, CPU를 위해 정의되어 있는 명령어들의 집합을 말합니다.

 

명령어 세트를 설계하기 위해서는 다음 사항들을 먼저 고려해야합니다.

  • 연산종류 (연산 수 및 복잡도 등)
  • 데이터 유형 (데이터 길이, 수 표현 방식 등)
  • 명령어 형식 (명령어 길이, 오퍼랜드 필드 수 등)
  • 주소지정 방식 (오퍼랜드 주소 지정 방식)

연산 종류

연산 종류로는 데이터 전송이나 산술연산, 논리연산, I/O 연산, 프로그램 제어 연산이 있습니다.

 

이 중 프로그램 제어를 위한 두 가지 기본연산이 있는데, 바로 CALL 명령어와 RET 명령어입니다.

 

CALL 명령어는 말그대로 서브루틴을 호출하는 명령어이고, RET 명령어는 서브루틴으로 부터 원래 프로그램으로 복귀하는 명령어 입니다.

 

먼저 CALL 명령어의 마이크로 연산입니다.

 

t0 : PC → MBR

t1 : SP → MAR, X → PC

t2 : MBR → M[MAR], SP - 1 → SP

 

먼저 현재 PC의 값을 MBR로 옮깁니다. 그리고 현재 스택 포인터 위치를 MAR에 저장함과 동시에 X의 값을 PC로 옮깁니다. (CALL X로 해서 받은 분기 위치가 X) 그리고 MBR의 값을 주기억장치의 MAR 위치에 저장합니다. 그와 동시에 스택 포인터는 하나 줄어듭니다.

 

다음으로 RET 명령어의 마이크로 연산입니다.

 

t0 : SP + 1 → SP

t1 : SP → MAR

t2 : M[MAR] → PC

 

CALL 명령어로 인해 줄어든 스택 포인터를 다시 증가시키고 스택 포인터 값에 덮어씁니다. 그리고 그 스택의 값을 MAR에 저장합니다. (스택 포인터가 1 증가했으므로, SP는 앞서 CALL 명령어 때 PC값이 저장된 위치를 가리킴) 그리고서 주기억장치의 MAR 위치의 값을 PC에 저장합니다.

 

명령어 형식

다음으로 명령어 형식입니다. 명령어 형식에는 다음 기본적인 요소들이 포함됩니다.

  • 연산 코드 (수행될 연산 지정)
  • 오퍼랜드 (연산 수행에 필요한 데이터 혹은 데이터의 주소)
  • 다음 명령어 주소(현재 명령어 실행이 완료된 후 다음 명령어를 인출할 위치)

각 명령어는 비트에 의해 표현돼서, 비트의 수로 위 정보를 나타내는데 필요한 만큼 사용됩니다. 이때, 비트들은 용도에 따라 필드들로 나눌 수 있는데, 필드의 수와 배치 방식, 각 필드의 포함되는 비트 수를 정의한것을 명령어 형식이라고 합니다.

 

명령어 형식에는 1 - 주소 명령어, 2 - 주소 명령어 3 - 주소 명령어 등이 있습니다.

 

먼저 1 - 주소 명령어는 ADD X; 와 같이 오퍼랜드로 1개만 포함합니다. 이 경우, AC의 값과 X를 더하여 AC에 저장하는 연산을 수행합니다. 즉, 1 - 주소 명령어는 추후 설명할 묵시적 주소지정 방식을 사용합니다.

 

2 - 주소 명령어는 ADD R1, R2; 와 같이 오퍼랜드 2개를 포함합니다. 이 경우, R1 + R2를 R1에 저장하게 됩니다. 해당 방식은 결과값이 저장되는 레지스터의 원래 값이 사라진다는 점이 있는 것을 유의해야합니다.

 

3 - 주소 명령어는 ADD R1, R2, R3;와 같이 오퍼랜드 3개를 포함합니다. 이 경우, R2 + R3를 R1에 저장하게 됩니다.

 

오퍼랜드가 포함하는 내용이 길수록, 프로그램의 길이가 짧아집니다. 단, 명령어의 길이는 증가하고 해독과정이 복잡해지며 실행시간도 증가합니다.

 

주소지정 방식

주소 지정방식은 앞서 설명했듯, 명령어 실행에 필요한 오퍼랜드의 주소를 결정하는 방식입니다.

 

여러 주소 지정방식을 설명하기 위해 다음 표기들을 정의합니다.

 

EA(Effective Address) = 유효 주소 (데이터가 저장된 기억장치의 실제 주소)

A = 명령어 내의 주소 필드 내용

R = 명령어 내의 레지스터 번호

(A) = 기억장치 A번의 내용

(R) = 레지스터 R의 내용

 

  1. 직접 주소지정 방식
    직접 주소지정 방식은 오퍼랜드 필드의 내용이 EA가 되는 방식으로 EA = A로 정의됩니다. 따라서, 이 경우 한번의 기억장치 접근으로 유효 주소 결정이 가능합니다. 단, 접근 가능한 기억장치 주소 공간이 오퍼랜드 필드의 비트 수에 의해 정해지는 점이 단점으로 꼽힙니다.
  2.  간접 주소지정 방식
    간접 주소지정 방식은 오퍼랜드 필드에 기억장치 주소를 가지고 있는 방식입니다. 그 주소가 가리키는 기억장소에 데이터의 유효주소가 저장되어 있습니다. EA = (A). 이 경우 직접 주소지정 방식에 비해 많은 개수의 데이터 접근이 가능합니다. WHY? RAM에 주소가 저장되기에 용량은 단어의 길이에 의해 지정됨. 하지만, RAM 접근이 두 번 이상 필요합니다. (다단계로 지정가능하므로 2번 이상 필요) 또한, 이 방식의 경우 명령어 형식에 간접비트(I)가 필요합니다.
  3. 묵시적 주소지정 방식
    묵시적 주소지정 방식은 명령어 실행에 필요한 데이터 위치를 정하지 않아도 이미 묵시적으로 정해져있는 방식을 의미합니다. 앞서 설명했던 ADD X; 나 LOAD A1 와 같은 니모닉스의 경우는 묵시적 주소지정 방식에 해당됩니다. 장점으로는 명령어의 길이가 줄어든다는 점이지만, 종류가 제한적이라는 단점 또한 가지고 있습니다.
  4. 즉시 주소지정 방식
    즉시 주소지정 방식은 오퍼랜드 필드에 연산에 쓸 실제 데이터가 저장된 경우입니다. 따라서, 주기억장치에 접근할 필요가 없다는 장점이 있지만, 직접 주소지정 방식과 마찬가지로 용량이 제한됩니다. 거기에 데이터는 상수값으로 초기값이 설정된다는 점도 있습니다.
  5. 레지스터 주소지정 방식
    레지스터 주소지정 방식은 연산에 사용될 데이터가 내부 레지스터에 저장되어 있는 방식입니다. EA = R
    따라서, 주기억장치 접근을 하지않아도 되고, 오퍼랜드 필드 길이에 영향을 받지 않습니다. 하지만, 데이터 저장공간이 CPU 내부의 레지스터들로 제한된다는 단점이 있습니다.
  6. 레지스터 간접 주소지정 방식
    레지스터 간접 주소지정 방식은 앞서 직접 주소지정 방식과 간접 주소지정 방식처럼, 오퍼랜드 필드에 저장된 레지스터 번호가 가리키는 레지스터의 내용을 유효주소로 사용하는 방식입니다. EA = (R).
    이 경우, 메모리에 한번만 접근하면 된다는 장점이 있지만, 용량이 레지스터 크기에 제한됩니다.
  7. 변위 주소지정 방식
    변위 주소지정 방식은 직접 주소지정 방식과 레지스터 간접 주소지정 방식이 결합된 방식으로, EA = A + (R)로 정의됩니다. 따라서, (R)에 따라 3가지로 나뉩니다.
    (1) 상대 주소지정 방식
          상대 주소지정 방식은 PC에 저장된 값을 기반으로 EA를 계산합니다. EA = A + (PC)
          이때, A가 양수라면, 앞으로 분기하고 음수라면 뒤로 분기합니다. 장점으로는 일반적인 분기 명령어 보다 작은 bit        로 분기할 수 있습니다. 하지만, 분기 범위가 오퍼랜드 필드 길이에 제한된다는 단점이 있습니다.
    (2) 인덱스 주소지정 방식
          인덱스 주소지정 방식은 인덱스 레지스터의 내용과 변위 A의 합으로 EA가 결정됩니다. EA = A + (IX)
          인덱스 레지스터는 배열의 첨자값인 인덱스를 저장하는 특수한 레지스터로 자동 인덱싱을 수행합니다.
          자동 인덱싱이란, 명령어 실행마다 IX 내용이 자동으로 증가 혹은 감소하는 역할을 합니다.
          (EA = (IX) + A; IX = IX + 1 을 연속 수행.)
    (3) 베이스 레지스터 주소지정 방식
          베이스 레지스터 주소지정 방식은 베이스 레지스터의 내용과 변위 A의 합으로 EA를 계산합니다. EA = (BR) + A
          베이스 레지스터는 각 프로그램의 시작주소(PC값)을 저장하고 있습니다. 이를 통해 프로그램 위치를 지정 혹은            변경이 가능합니다.

상용 프로세서들의 명령어 형식

현재 상용 프로세서들은 명령어의 수를 최소화하고 명령어의 길이를 일정하게 고정하며, 주소지정 방식의 종류도 단순화하는 개념에 기반합니다. 이를 바탕으로 출시한 새로운 유형의 프로세서를 RISC(Reduced Instruction Set Computer) 프로세서 라고 부릅니다. 그와 반대로, 복잡한 명령어 형식을 가진 기존의 프로세서를 CISC(Complex Instruction Set Computer) 프로세서라고 부릅니다.

 

CISC 프로세서는 명령어의 수가 많고, 길이가 길며 가변적입니다. 즉, 3 - 주소 명령어 처럼 오퍼랜드가 포함하는 내용이 깁니다. 따라서, 프로그램의 길이는 짧아지고 주소지정 방식이 다양해집니다. 물론 그에 따른 명령어 실행시간은 증가합니다. (3 - 주소 명령어의 특징)

 

또한 H/W에 접근하는 방식이고, 명령어 처리에 여러 클록을 필요로합니다. 대표적으로는 Intel Pentium 프로세서가 CISC 프로세서로 분류됩니다.

 

RISC 프로세서는 CISC 프로세서와 반대로 명령어 수가 적고, 길이가 짧으며 가변적이지 않고 프로그램 길이가 길고 주소지정 방식이 단순합니다. (1 - 주소 명령어, 2 - 주소 명령어의 특징) 주소지정 방식이 단순하기에 레지스터를 많이 사용합니다. CISC 프로세서는 메모리와 메모리 사이에 LOAD와 STORE가 가능했다면 (ADD c, a, b) RISC 프로세서는 레지스터와 레지스터 사이에 LOAD와 STORE가 가능합니다. (ADD R1, R2, R3) 또한, S/W에 접근하는 방식이고 단일 클록에 명령어를 처리합니다. S/W에 접근하는 방식이기에 컴파일러가 중요한 프로세서라고 볼 수 있습니다. (컴파일러의 최적화에 따라 다름) 대표적으로 ARM 계열의 프로세서가 RISC 프로세서에 해당합니다.

 

파이프라이닝에는 RISC가 유리합니다. (단일 클록에 명령어 처리가 가능하기 때문에)

하지만, 성능 척도를 비교하기에는 어렵다고 볼 수 있습니다.

그 이유로는 시간 / 프로그램 실행 = (시간/주기 * 주기/명령어)[A] * (명령어/프로그램)[B]  에서 A는 RISC가 유리하지만, B는 CISC가 유리하기에 어느것이 더 좋다고 하기에는 모호합니다.

반응형

'Computer Science > 컴퓨터 구조' 카테고리의 다른 글

컴퓨터의 논리연산  (1) 2024.01.08
컴퓨터의 수 표현  (0) 2024.01.08
명령어 파이프라이닝  (1) 2024.01.03
명령어 실행  (0) 2024.01.02
CPU의 구조  (0) 2024.01.02