기계적 명령어를 설계하는 것은 하드웨어 구조에 영향을 끼치기에 명령어의 종류와 형식, 주소 지정 방식 등 여러가지를 고려해야 한다. 지금부터 명령어 집합에 대해서 더 자세히 알아보도록 하겠다.
명령어 구성 (Instruction Structure)
하나의 명령어는 0과 1의 비트들의 집합으로 필트(Field)라 불리는 여러 개의 비트 그룹으로 나뉘어진다. 이 중 대표적인 필드가 연산자 코드 필드(Operation Code)와 피연산자 필드(Operand Field)이다.
연산자 코드 필드 (Operation Code Field) |
피연산자 필드 (Operand Field) |
연산자 코드 필드
: 수행할 연산자의 종류를 나타내며 보통 op-code(Operation Code)로 불린다.피연산자 필드
: 피연산자에 대한 정보를 표시하는 부분으로 메인 메모리의 주소, 레지스터 번호, 또는 사용할 데이터 등을 나타낸다.
명령어 종류 (Instruction Type)
구성된 컴퓨터 명령어들을 크게 연산 기능, 데이터 전송 기능, 제어 기능, 입출력 기능 이렇게 네 가지의 기능을 수행한다. 기본적인 명령어를 조합하여 특별한 연산을 수행하는 다른 명령어를 제작할 수 있다.
연산 기능 | 산술 연산 | ADD | 두 데이터의 간의 덧셈 |
SUB | 두 데이터의 간의 뺄셈 | ||
MUL | 두 데이터의 간의 곱셈 | ||
DIV | 두 데이터의 간의 나눗셈 | ||
Arithmetic shift (SHA) | 산술 쉬프트 | ||
논리 연산 | AND | 두 데이터의 비트 단위의 and 연산 | |
OR | 두 데이터의 비트 단위의 or 연산 | ||
NOT | 두 데이터의 비트 단위의 not 연산 | ||
XOR | 두 데이터의 비트 단위의 xor 연산 | ||
Logical shift (SH) | 논리 쉬프트 | ||
ROL, ROR | 논리 로테이트 | ||
COM | 보수 연산 | ||
데이터 전송 기능 | LOAD | 메인 메모리의 데이터를 CPU 내부의 레지스터로 복사 | |
STORE | 레지스터의 데이터를 메인 메모리로 복사 | ||
PUSH | 스택에 자료를 저장하는 명령어 | ||
POP | 스택에서 자료를 꺼내는 명령어 | ||
제어기능 | 분기 연산 | BR | 분기를 위해서 pc 값 변경 |
조건 비교 연산 | CMP | 특정 값들을 비교해서 조건을 결정함 | |
함수 호출 | CALL | 함수 호출 | |
함수 복귀 | RET | 함수에서 복귀 | |
입출력 기능 | IN | 입력 장치에서 메인 메모리로 입력하는 명령어 | |
OUT | 메인 메모리에서 출력 장치로 출력하는 명령어 |
명령어 형식 (Instruction Set)
명령어 집합은 컴퓨터 내에서 사용 가능한 명령어의 집합을 의미하며, 모든 컴퓨터는 고유한 명령어 집합을 가진다. 컴퓨터 명령어는 내부구조에 따라 여러 가지 형식으로 나타나는데, 명령어를 구성하는 필드 수와 배치 방식 및 각 필드의 비트 수를 바로 명령어 형식(Instruction Set)이라고 한다. 오퍼랜드(피연산자)의 기억장소에 따라 분류하는 방식, 오퍼랜드의 수에 따라 분류하는 방식 등이 있다.
기억장소에 따른 명령어 형식
오퍼랜드를 기억시키는 장소에 따라 명령어 형식은 크게 3가지로 분류된다.
누산기를 이용한 명령어 형식
누산기(Accumulator)를 가진 컴퓨터 구조는 연산 기능 명령어 수행 시 오퍼랜드 중 하나가 누산기에 기억되도록 한다. 누산기가 있는 컴퓨터 구조에서 수행되는 모든 연산은 누산기 레지스터를 대상으로 수행되며, 1-주소 명령어
로서 하나의 기억 장치 주소 필드를 사용한다.
# 연산 기능 명령어 ADD X # (AC <- AC + M[X] 수행) # 전달 기능 명령어 LOAD X # (AC <- M[X] 수행) STORE X # (M[X] <- AC 수행)
이때, AC는 누산기 레지스터, M[X]는 기억장치의 X라는 주소에 기억된 단어를 나타낸다.
다중 레지스터를 이용한 명령어 형식
다중 레지스터를 가진 컴퓨터 구조는 중앙처리장치 내의 2개 이상 레지스터를 사용하여 연산을 수행한다. 2-주소 명령어
또는 3-주소 명령어
를 사용한다.
# 연산 기능 명령어 #(3-주소 명령어) ADD R1, R2, R3 # (R3 <- R1 + R2 수행) # 연산 기능 명령어 #(2-주소 명령어) ADD R1, R2 # (R2 <- R1 + R2 수행) # 전달 기능 명령어 MOVE R1, R2 # (R2 <- R1 수행) LOAD X, R1 # (R1 <- M[X] 수행) STORE R1, X # (M[X} <- R1 수행)
이때, R1, R2, R3는 레지스터, M[X]는 기억장치의 X라는 주소에 기억된 단어를 나타낸다.
스택 구조를 이용한 명령어 형식
스택 구조 컴퓨터 구조는 오퍼랜드들을 기억장치 스택에, 연산 결과도 스택에 기억시키는 구조이다. 스택 구조 명령어는 0-구조 명령어
로 명령 수행에 필요한 두 오퍼랜드가 스택에 저장되기에 오퍼랜드가 기억되어 있는 것을 알 수 있다.
연산 기능 명령어 형식은 연산코드만 나타낸다. 다만, 전송 명령어는 하나의 기억장치주소를 사용한다.
# 연산 기능 명령어 ADD # (TOS <- M[X] 수행) # 전송 기능 명령어 PUSH X # (TOS <- M[X] 수행) POP X # (M[X} <- TOS 수행)
이때, TOS는 Top Of Stack의 약자로 스택의 맨 위를 나타내고 M[X]는 기억장치의 X라는 주소에 기억된 단어를 나타낸다.
오퍼랜드의 수에 따른 명령어 형식
오퍼랜드의 수에 따른 명령어 형식은 오퍼랜드가 주소를 나타낼 때 오퍼랜드의 수에 따라 분류하는 방법이다.
0-주소 명령 형식 (스택 구조)
0-주소 명령어 형식은 레지스터와 기억장치주소를 사용하지 않는 방식으로, 산술연산에 관한 명령어 수행 시, 기억장치 스택을 사용한다. 명령어의 길이가 매우 짧아 기억공간을 적게 차지한다. 다만, 많은 양의 정보가 스택과 주기억장치를 이동하게 되어 비효율적이다.
1-주소 명령 형식 (단일 누산기 구조)
1-주소 명령어 형식은 오퍼랜드가 1개인 명령어 형식으로, 기억 장치 내의 데이터와 누산기(AC) 내의 데이터로 연산이 이루어지고 연산 결과는 누산기(AC)에 저장된다.
2-주소 명령 형식 (다중 레지스터 구조)
2-주소 명령어 형식은 상업용 컴퓨터에서 가장 많이 사용되는 방식으로, 오퍼랜드가 2개인 명령어 형식이다. 사칙 연산 명령어에 포함된 오퍼랜드 주소 필드 중 두 번째 오퍼랜드 주소 필드가 연산 결과를 저장하는 임시적인 주소이다.
3-주소 명령 형식 (다중 레지스터 구조)
3-주소 명령어 형식은 오퍼랜드가 3개인 명령어 형식으로, 각각의 오퍼랜드는 레지스터나 기억장치의 주소일 수 있고 연산에 사용되는 데이터가 직접 저장될 수도 있다. 다른 주소 명령어 형식보다 비트 수가 더 많이 필요하지만 산술식을 프로그램화할 때 총 명령어 수가 줄어든다.
주소 지정 방식 (Addressing Mode)
명령어 내 연산코드 필드는 수행할 명령어의 종류를 지정하고, 지정된 명령어는 레지스터 또는 기억장치에 저장된 항목을 대상으로 수행한다. 이때, 프로그램 수행 시 오퍼랜드를 지정하는 방식은 "주소 지정 방식"에 의해 결정되는데, 주소 지정 방식(Addressing Mode)은 오퍼랜드를 실제로 참조하기 전 명령어의 오퍼랜드를 변경하거나 해석하는 규칙을 지정하는 형식이다.
주소 지정 방식의 종류
의미 주소 지정 방식 (Implied Mode)
피연산자로 명시하지 않아도 묵시적으로 지정된 주소를 사용하는 방식이다. (Ex. 스택 머신)
즉시 주소 지정 방식 (Immediate Mode)
피연산자가 명령어에 포함되는 방식으로 실행 속도가 빠르나, 데이터의 크기에 제한이 있다.
직접 주소 지정 방식 (Direct-Addressing Mode)
명령어의 피연산자 지시자가 피연산자의 주소를 의미하는 방식으로, 피연산자를 사용하기 위해 메인 메모리 접근이 필요하다.
간접 주소 지정 방식 (Indirect-Addressing Mode)
명령어의 주소 필드가 실제 피연산자의 주소 값을 가지는 곳의 주소를 가리킨다. (주소의 주소) 명령어에 나타낼 주소가 명령어 내에서 데이터를 지정하기 위해 할당된 비트 수로 나타낼 수 없을 때 사용한다.
레지스터 주소 지정 방식 (Register Addressing Mode)
주소 부분에 레지스터 번호를 사용하는 방식으로 주소 필드가 작아도 되며 속도가 매우 빠르나, 레지스터 개수에 제한이 있다.
레지스터 간접 주소 지정 방식 (Register-Indirect Addressing Mode)
명령어의 주소 필드는 레지스터를 가르키고, 레지스터는 메인 메모리에 있는 피연산자의 주소값을 가지는 방식이다.
변위 주소 지정 방식 (Offset Addressing Mode)
어떤 주소를 기준으로 주소를 매기는 방식으로 최종 주소를 결정하기 위해 기준값과 변위값을 같이 사용한다. 이때, 기준값으로 사용하는 레지스터의 종류에 따라 "상대 주소 지정 방식", "인덱스 주소 지정 방식", "베이스 레지스터 주소 지정 방식"으로 나뉜다.