명령어 집합
- Instruction Set
- CPU가 수행할 동작을 정의하는 2진수 코드로 된 명령들의 집합
- 기계 명령어라고도 부르며 일반적으로 어셈블리 코드 형태로 표현
- 명령어 집합은 CPU의 사용 목적, 특성에 따라 결정됨
- 명령어 집합 설계를 위해 결정되어야 할 사항들
- 연산 종류: CPU가 수행할 연산들의 수와 종류 및 복잡도 등을 결정해야 함
- 데이터 형태: 연산을 수행할 데이터들의 형태, 데이터의 길이(비트 수), 수의 표현 방식 등을 고려해서 명령어들을 만들어야 함
- 명령어 형식: 명령어의 길이, 오퍼랜드 필드들의 수와 길이 등을 고려함
- 주소 지정 방식: 피 연산자의 주소를 지정하는 방식을 고려해야 함
명령어 집합의 특성
명령어 형식
- 연산 코드 (Operation Code)
- 수행할 연산을 지정하는데 연산자라고도 함
- 함수 연산 기능, 전달 기능, 제어 기능, 입출력 기능으로 분류됨
- 오퍼랜드 (Operand)
- 연산을 수행하는 데 필요한 데이터 혹은 데이터의 주소를 나타냄
- CPU의 레지스터, 주기억장치, 혹은 입출력장치 등에 저장된 데이터 또는 주소가 됨
- 다음 명령어 주소가 위치할 수 있음
명령어 형식
- Instruction Format
- 명령어를 표현하는 방식은 여러 개의 필드들로 나누어지며 각 필드는 일련의 비트 패턴에 의해 표현됨
- 명령어 내 필드들의 수와 배치 방식 및 각 필드의 비트 수에 의해서 명령어가 표현되는데, 이러한 표현 방법을 명령어 형식이라고 함
- 예시: 3개의 필드들로 구성된 16비트 명령어
- 하나의 연산코드와 두 개의 오퍼랜드가 존재하며, 16비트 명령어 길이가 하나의 워드가 됨
- 두 개의 오퍼랜드들은 기호로 표현됨 (e.g. ADD X, Y → 데이터 위치 Y에 저장된 값을 X 번지의 내용과 더하라는 의미)
명령어 집합에서 연산의 종류
함수 연산 기능
- Functional Operation
- 함수의 연산 기능을 담당하는 명령어 집합에는 산술 연산과 논리 연산 명령 등이 있음
- 산술 연산
- ADD, SUB, MUL, DIV, 산술 shift 등
- 단일 오퍼랜드 산술 연산 명령: 절대값, 음수화, 1 증가, 1 감소 명령어
- 논리 연산
- AND, OR, NOT, XOR, 논리적 shift, Rotate 등
전달 기능
- Transfer Operation
- CPU와 주기억장치 사이, CPU 내의 레지스터 간의 정보교환과 적재(load, fetch) 저장 기능을 수행함
- 전달 기능의 명령어에서는 정확한 데이터 전송을 위해서 근원지(source) 오퍼랜드와 목적지(destination) 오퍼랜드 위치가 명시되어야 함
LOAD | 하위 기억장치에서 상위 기억장치로의 데이터 전송 |
STORE | 상위 기억장치에서 하위 기억장치로의 데이터 전송 |
MOV | 레지스터 간에 데이터 전송 |
Push | 스택에 데이터 저장 명령 |
Pop | 스택에서 데이터를 꺼내는 명령 |
입출력 기능
- Input/Output Operation
- 입출력 기능을 위한 명령어 집합은 CPU와 외부 장치들 간의 데이터 이동을 수행함
- 분리형 입출력(Isolated I/O)의 경우에는 별도의 입출력 명령어를 사용
- 기억장치-사상 입출력(Memory Mapped I/O)의 경우에는 일반적인 데이터 이동 명령어들을 동일하게 입출력에도 사용
INPUT | 입출력장치의 데이터를 주기억장치로 입력 |
OUTPUT | 주기억장치의 데이터를 입출력장치로 출력 |
제어 기능: 분기 명령어
- 오퍼랜드가 다음에 실행할 명령어 주소를 가지고 있으며, 명령어 내용에 따라서 무조건 오퍼랜드의 주소로 이동하거나 조건 만족 시에만 이동함
- 조건 분기는 조건 코드와의 부합 여부에 따라서 분기가 결정되며, 조건 코드에는 0, 부호(+, -), 오버플로우 플래그 등이 있음
- 명령어에 대한 마이크로 연산의 표현법
- A: 기억장치의 주소
- PC, MAR과 같은 레지스터 이름: 레지스터의 내용
- M[A]: 기억장치 A번지의 내용
- [R]: 레지스터가 가리키는 주소의 내용
- <- : 데이터의 이동방향
제어 기능: 서브루틴 호출 명령어
- 호출 명령어(CALL 명령어)는 현재 PC 내용을 스택에 저장하고 서브루틴의 시작 주소로 분기하는 명령어
- 복귀 명령어(RET 명령어)는 CPU가 원래 실행하던 프로그램으로 되돌아가도록 하는 명령어
제어 명령어의 종류별 차이
- call: 서브루틴으로 갔다 오기
- jump: 멀리 가기
- 분기명령어(branch): 가까운 거리로 가기
오퍼랜드 형태와 수에 따른 명령어 분류
주소 | 주기억장치의 주소이거나 레지스터의 주소 |
수 | 정수 혹은 고정-소수점 수, 부동-소수점 수, BCD 등을 사용 |
문자 | ASCII 코드가 사용됨 |
논리 데이터 | 비트 혹은 플래그 등으로 사용됨 |
- 오퍼랜드가 주소를 나타낼 때, 오퍼랜드 수에 따라 3, 2, 1, 0 주소 방식이 있음
주소 수에 따른 명령어 분류
- 3-주소 명령어 형식: 연산 코드 + 주소 1 + 주소 2 + 주소 3
- 2-주소 명령어 형식: 연산 코드 + 주소 1 + 주소 2
- 1-주소 명령어 형식: 연산 코드 + 주소 1
- 0-주소 명령어 형식: 연산 코드
주소 수에 따른 명령어 표현 (어셈블리어)
- 1-주소 명령어: LOAD X
- 2-주소 명령어: MOV X, Y
- 3-주소 명령어: ADD X, Y, Z
0 주소 명령어
- 0 주소 명령어는 자료의 주소를 지정하는 오퍼랜드부가 없이 op-code만으로 구성된 명령어
- 모든 연산은 스택 메모리에 대한 SP가 가리키는 오퍼랜드를 이용해 수행됨
- 스택에 기억된 자료만을 이용하여 연산하기 때문에 명령어 수행 속도가 빠름
- 오퍼랜드가 없어서 명령어의 길이가 짧아 기억공간 사용이 효율적
1 주소 명령어
- 오퍼랜드 한 개만 포함하는 명령어로서, 오퍼랜드 형태는 주소
- 오퍼랜드 한 개만 포함하는 명령어이므로, 이 명령어가 제대로 동작하려면 두 번째 주소는 함축적(implicit)으로 지정되어야 함
- 일반적으로 누산기 레지스터가 함축적으로 지정되어 사용됨
2 주소 명령어
- 오퍼랜드 2개를 포함하는 명령어 형식으로 오퍼랜드 2개 모두 주소를 저장하는데 사용하는 경우
3 주소 명령어
- 오퍼랜드 3개가 존재하며 레지스터의 주소를 저장하는 명령어 형식 등
명령어 형식이 프로그래밍에 미치는 영향
- 오퍼랜드의 개수 0, 1, 2, 3에 따라서 작성된 프로그램의 특성이 달라짐
- 0 주소 명령어부터 3 주소 명령어까지 주소 개수에 따른 장단점
- 주소 개수가 많아질수록 이를 저장할 오퍼랜드의 수가 많아지기 때문에 명령어가 더 복잡해짐
- 레지스터 수가 많아져 연산 속도가 빨라지고 프로그램이 짧아져서, 프로그램 당 명령어 수가 감소하게 됨
- 주소 개수가 적은 명령어는 오퍼랜드의 수가 적어서 간단하므로 명령어 인출과 실행 속도가 빨라짐
- 그러나 프로그램의 길이기 길어짐 (메모리를 많이 차지)
- 주소 개수가 많아질수록 이를 저장할 오퍼랜드의 수가 많아지기 때문에 명령어가 더 복잡해짐
명령어 형식
- 명령어 내의 비트 배열
- 명령어 구성 요소에는 하나의 연산 코드(op-code)와 한 개 이상의 오퍼랜드들이 존재하므로 명령어 집합에는 한 가지 이상의 명령어 형식이 존재함
- 연산 코드의 비트 길이와 오퍼랜드의 수와 길이에 따라 명령어 형식이 달라질 수 있음
명령어 길이에 영향을 주는 요소
- 기억장치 용량과 조직
- 기억장치 용량과 기억장치 조직에 의해서 주소를 지정하는 오퍼랜드 부분이 영향을 받음
- 기억장치의 용량이 많은 경우, 주소의 수가 많아져 오퍼랜드의 비트 수도 많아져야 함
- 버스 조직 (Bus Structure)
- 데이터를 한번에 운반할 수 있는 능력을 나타내는 것이 버스 조직이므로, 데이터를 전송하는 명령어의 경우 이에 맞는 명령어의 길이가 필요할 것
- CPU의 복잡도와 CPU의 속도
- 명령어는 CPU가 한 번에 읽고 쓸 수 있는 단위로 수행됨
- CPU가 한 번에 읽고 쓸 수 있는 비트 수를 워드라고 함
- 따라서 단어의 크기에 따라서 명령어의 길이가 정해짐
명령어의 종류에 따른 명령어 형식
- 연산 코드의 종류와 오퍼랜드의 개수가 많아지면 프로그램이 짧아질 수 있어 프로그램 저장 용량이 줄어듦
- 16비트의 명령어는 8비트의 명령어보다 2배의 공간을 차지하지만 2배 만큼 유용하지 않을 수 있기 때문에 긴 명령어는 낭비가 될 수 있음
- 이러한 이유로 명령어 종류와 비트 수에 대한 적절한 조정이 필요
명령어 내에서 주소 지정비트들의 할당에 영향을 주는 요소들
- 주소지정 방식의 수
- 묵시적 주소지정방식일 경우 이외에는 주소지정방식 표기를 위한 한 개 또는 그 이상의 비트들이 필요함
- 명령어 내 오퍼랜드의 수
- 오퍼랜드가 주소를 나타내는 경우, 주소의 수가 적으면 프로그램의 길이가 더 길어지고 복잡해짐
- 최근 컴퓨터들은 대개 두 개의 오퍼랜드를 가짐
- 오퍼랜드 저장에 사용되는 레지스터의 수
- 컴퓨터는 처리할 데이터를 CPU로 가져오는 데 사용할 레지스터가 필수임
- AC(누산기)를 사용하는 경우 오퍼랜드 주소들 중의 한 개는 묵시적으로 지정되어, 명령어 비트를 소비하지 않음
- 따라서, 오퍼랜드 참조를 위하여 사용되는 레지스터들이 더 많아질수록 사용되는 비트들의 수는 적어짐
- 레지스터 집합의 수
- 보통 최신 컴퓨터는 32개의 레지스터들로 이루어진 범용 레지스터 집합을 가짐
- 이들은 데이터의 저장과 변위 주소 지정을 위한 주소의 저장에 사용됨
- 레지스터 집합들이 기능적으로 분리되면 명령어에서 사용되는 비트의 수가 줄어듦
- 예를들어, 각각 16개의 레지스터들로 이루어진 두 개의 레지스터 집합이 있다면, 레지스터를 지정하는 데 필요한 비트들은 단 4개 뿐임
- 연산코드는 어느 레지스터 집합을 사용할 것인지를 묵시적으로 결정해줌
- 주소 영역 (Address Range)
- 주소를 이용하여 접근할 수 있는 주소 영역은 주소 비트들의 수와 관계가 있음
- 이것은 심각한 제한 요소이기 때문에 직접 주소 지정은 자주 사용되지 않음
- 주소 세분화 (Address Granularity)
- 주소는 설계자의 선택에 따라 주소 지정 단위로 바이트 혹은 워드 단위로 지정 가능함
- 바이트 주소 지정은 문자 조작을 더 편리하게 해주지만 기억장치 크기가 커질수록 주소 비트들이 더 많이 필요하게 됨
가변길이 명령어
- 명령어 형식에서 서로 다른 길이를 가지는 경우
- 길이가 서로 다른 더 많은 종류의 연산 코드들을 쉽게 제공해줄 수 있음
- 레지스터와 기억장치 참조들을 주소 지정 방식들과 다양하게 결합함으로써 주소 지정이 더욱 융통적임
- 가변 길이 명령어 때문에 CPU의 복잡도가 증가하는 단점이 있음
축소 명령어 집합 컴퓨터
- 복잡 명령어 집합 컴퓨터 (CISC, Complex Instruction Set Computer)
- 전통적인 컴퓨터의 CPU에서는 명령어가 복잡하기 때문에 명령어를 해석하는 데 시간이 오래 걸리며, 명령어 해석에 필요한 회로도 복잡합
- CPU가 명령어를 수행하려면 여러 개의 클록이 소요되어 처리속도가 느려짐
- 축소 명령어 집합 컴퓨터 (RISC, Reduced Instruction Set Computer)
- 최근에는 CPU의 명령어 개수를 줄여 하드웨어 구조를 좀 더 간단하게 만드는 방식으로 축소 명령어 집합 컴퓨터 구조가 사용되고 있음
- CISC보다 구조가 단순하기 때문에 복잡한 연산도 적은 수의 명령어들을 조합하여 수행할 수 있으므로 처리 속도를 향상시킬 수 있음
CISC
- 복잡한 명령어 집합을 갖는 CPU 구조를 복잡 명령어 집합 컴퓨터(CISC)라고 함
- 마이크로 프로그래밍을 통하여 다양한 길이의 명령어 형식 등의 여러 가지 명령어와 주소지정 모드를 구현할 수 있음
- 연산에 대해서는 레지스터와 레지스터 연산, 레지스터와 메모리 연산, 메모리와 메모리 연산을 모두 갖추고 있는 것이 보통임
- 오퍼랜드는 2개에서 3개까지 지정할 수 있는 경우가 많음
- 처리속도를 향상시키기 위해서 마이크로 프로그램의 프로시저나 서브루틴 등을 뻐른 속도의 ROM에 마이크로 코드화하여 구현함
- 주로 X86 호환 프로세서, 모토로라사의 MC680x0 계열 프로세서에서 CISC 방식을 사용함
CISC의 사용에 대한 단점
- 단순화 작업을 통한 최적화가 쉽지 않음
- 고급 언어 프로그램을 기계어로 변경해주는 컴파일러에서 컴파일 과정이 단순화되면 그 만큼 컴퓨터 성능이 향상됨
- 그러나 CISC 기반 프로그램에서는 프로그램 코드의 수를 최소화하고, 명령어 실행 횟수를 줄이는 등의 최적화가 쉽지 않음
- 기억장치의 가격이 하락함에 따라 CISC의 장점인 짧은 프로그램의 장점은 효력이 없음
- 컴퓨터 관련 기술의 발전으로 기억장치의 용량은 커지고 가격은 하락하고 있음
- 이런 상황에서 CISC는 짧은 프로그램을 생성해서, 프로그램이 기억장치를 적게 차지하므로 자원이 절약된다고 말할 수 없음
- CISC가 실행을 빠르게 하는 것은 아님
- 명령어를 복잡하게 만든 이유는 한 개의 복잡한 명령어가 여러 개의 기본 명령어들보다 더 빨리 실행되므로 CISC가 명령어를 더 빠르게 실행할 수 있다고 생각함
- 그러나 복잡한 작업의 수행에 있어서 속도의 증가는 복잡한 기계 명령어의 능력 때문이 아니라 고속의 제어 장치가 존재하기 때문임
- 현대 컴퓨터에는 적합하지 않음
- CISC는 컴파일러의 단순화 측면, 짧은 프로그램 측면, 빠른 실행속도 측면을 분석해보면 여전히 제어기의 구성이 복잡하고 명령 단위의 수행 시간이 길어 고속 처리를 요구하는 현대 컴퓨터에는 적합하지 않음
RISC
- CPU의 명령어 개수를 줄여 하드웨어 구조를 좀 더 간단하게 만드는 방식을 축소 명령어 집합 컴퓨터(RISC)라고 함
- 적은 수의 명령어만으로 명령어 집합을 구성한 것
- RISC는 대부분의 현대 프로세서 디자인에 채택되고 있고, 비교적 전력 소모가 적기 때문에 임베디드 프로세서에도 채택되고 있음
RISC 구조의 특징
- RISC는 명령어가 단순하므로 사이클 당 한 명령어 실행이 가능함
- 결과적으로 CISC의 마이크로 명령어보다 덜 복잡하고, 또한 그만큼 빨리 수행될 것임
- 단순 명령어의 특징은 많은 비트를 필요로 하지 않아서, 레지스터간 연산 가능
- 대부분의 연산들이 레지스터들 사이에서 수행되며, 기억장치에 접근하는 동작들이 간단한 LOAD와 STORE 명령어에 의해 레지스터 연산으로 대체되고 제어장치도 간단해짐
- 주소 지정방식에 있어서도, 단순하게 레지스터 주소 지정 방식을 사용하므로 적은 수의 간단한 주소지정 방식을 사용한다는 것
- 추가로 변위 혹은 상대주소지정방식 같은 방식 포함 가능 (주로 5가지 이하의 주소지정방식 사용)
- 시간이 많이 소모되는 간접 주소지정이 없음
- 간단한 주소지정방식으로 제어장치의 단순화가 이루어짐
- 적은 수의 단순한 명령어 형식을 사용한다는 특징이 있음
- 명렁어 길이가 고정적으로 일정하며, 연산코드도 고정적이라서 연산 코드의 해독과 레지스터 오퍼랜드의 접근이 동시에 일어나는 게 가능
- 명령어 형식이 단순하면 제어 장치도 단순해져 명령어 인출이 최적화됨
- 현대 프로세서 대부분은 RISC 구조를 채택하고, 저전력용 임베디드 프로세서에도 채택됨
- 요즘에는 CISC CPU도 내부적으로는 복잡한 명령을 단순 명령으로 나누워 파이프라인 처리하기 때문에, 실제 동작은 RISC와 같음