기계어와 어셈블리어 프로그래밍을 배웠다면 일반적인 컴퓨터 상에서 사용되는 기계어 명령어에 대해서 배워보겠습니다. 이를 명령어 집합이라고 합니다. 기계적 명령어를 설계하는 것은 하드웨어 구조에 영향을 끼치기에 명령어의 종류와 형식, 주소 지정 방식 등 여러가지를 고려해야 합니다. 지금부터 명령어 집합에 대해서 더 자세히 알아보도록 하겠습니다.
명령어 구성
하나의 명령어는 보통 "연산자 코드(op-code)", "모드(mode)", "피연산자 지시자(operand specifier)"로 구성됩니다.
연산자 코드 (Operation Code) |
모드 (Mode) |
피연산자 지시자 (Operand Specifier) |
- 연산자 코드: 수행할 연산자의 종류를 나타내며 보통 op-code(Operation Code)로 불립니다.
- 모드: 피연산자 지시자에 의한 피연산자의 유효 주소를 결정하는 모드를 결정합니다.
- 피연산자 지시자: 피연산자에 대한 정보를 표시하는 부분으로써 메인 메모리의 주소, 레지스터 번호, 또는 사용할 데이터 등을 표시한다.
연산자 코드(Op-code)
컴퓨터의 종류에 따라 컴퓨터가 이해 가능한 기계어의 형태는 조금씩 다르다. 다음은 일반적으로 많이 사용되는 명령어들입니다.
연산 기능 | 산술 연산 | add | 두 데이터의 간의 덧셈 |
sub | 두 데이터의 간의 뺄셈 | ||
mul | 두 데이터의 간의 곱셈 | ||
div | 두 데이터의 간의 나눗셈 | ||
arithmetic shift | 산술 쉬프트 | ||
논리 연산 | and | 두 데이터의 비트 단위의 and 연산 | |
or | 두 데이터의 비트 단위의 or 연산 | ||
not | 두 데이터의 비트 단위의 not 연산 | ||
xor | 두 데이터의 비트 단위의 xor 연산 | ||
logical shift | 논리 쉬프트 | ||
logical rotate | 논리 로테이트 | ||
complement | 보수 연산 | ||
데이터 전송 기능 | load | 메인 메모리의 데이터를 CPU 내부의 레지스터로 복사 | |
store | 레지스터의 데이터를 메인 메모리로 복사 | ||
push | 스택에 자료를 저장하는 명령어 | ||
pop | 스택에서 자료를 꺼내는 명령어 | ||
제어기능 | 분기 연산 | br | 분기를 위해서 pc 값 변경 |
조건 비교 연산 | cmp | 특정 값들을 비교해서 조건을 결정함 | |
함수 호출 | call | 함수 호출 | |
함수 복귀 | return | 함수에서 복귀 | |
입출력 기능 | input | 입력 장치에서 메인 메모리로 입력하는 명령어 | |
output | 메인 메모리에서 출력 장치로 출력하는 명령어 |
명령어의 형식
명령어의 형식에서 가장 큰 영향을 미치는 요소는 "주소 필드의 수"입니다. 주소 필드의 개수에 따라 컴퓨터의 CPU 구조가 결정되기 때문입니다. 그렇게 결정되는 CPU의 구조로는 "단일 누산기 구조", "범용 레지스터 구조", "스택 구조" 등이 있습니다.
0-주소 명령 형식 (스택 구조)
연산자 코드(Op-code)만 존재하고 주소가 없는 형식이 바로 스택 구조입니다. 스택 머신이라고도 불립니다. 피연산자를 특정하지 않고, 피연산자를 스택에 보관합니다. 스택 포인터 레지스터가 가르키는 주소인 스택의 TOP에서 피연산자의 사용 및 저장이 이루어지고 스택 구조답게 PUSH, POP을 이용하여 데이터를 저장하고 꺼냅니다.
스택에 기억된 데이터를 사용하기에 인스트럭션 수행 시간이 짧고 피연산자를 표현할 필요가 없기에 인스트럭션 길이가 짧습니다.
1-주소 명령 형식 (단일 누산기 구조)
피연산자를 지정하는 주소 영역이 1개인 명령어가 단일 누산기 구조입니다. 이항 연산자인 경우. 피연산자 두 개 중 하나만 명령어에 표현하고 나머지 하나는 누산기를 사용하는 방식입니다.
주기억 장치 내의 데이터와 누산기(AC) 내의 데이터로 연산이 이루어지고 연산 결과는 누산기(AC)에 저장됩니다.
2-주소 명령 형식 (범용 레지스터 구조)
피연산자 두 개의 주소를 모두 표현하고 연산 결과를 그 중 한 곳에 저장합니다. 여러 개의 범용 레지스터를 가진 컴퓨터에서 주로 사용되는 명령어 형식입니다. 한 곳의 내용이 연산 결과 저장으로 인해 소멸됩니다.
3-주소 명령 형식
피연산자를 위한 두 개의 주소와 연산 결과를 저장하기 위한 결과 주소를 표현합니다. 이 방법은 하나의 인스트럭션을 수행하기 위해 피연산자를 최소 3번 접근해야 하기 때문에 수행 기간이 길어서 특수 목적 이외에는 잘 쓰지 않습니다.
피연산자 주소 지정 방식
프로그램이 수행되는 동안 사용될 데이터의 위치를 지정하는 방식을 "피연산자 주소 지정 방식"이라고 합니다. 프로그래밍을 할 때 빠르게 피연산자에 접근하고 주소 지정을 할 때 가능한 적은 수의 비트를 사용하도록 다양한 주소 지정 방식이 필요합니다. 다음과 같은 주소 지정 방식이 존재합니다.
- 묵시적 주소 지정 방식: 피연산자로 명시하지 않아도 묵시적으로 지정된 주소를 사용하는 방식이다. (Ex. 스택 머신)
- 즉시 주소 지정 방식: 피연산자가 명령어에 포함되는 방식으로 실행 속도가 빠르나, 데이터의 크기에 제한이 있다.
- 직접 주소 지정 방식: 명령어의 피연산자 지시자가 피연산자의 주소를 의미하는 방식, 피연산자를 사용하기 위해 메인 메모리 접근이 필요하다.
- 간접 주소 지정 방식: 명령어의 주소 필드가 실제 피연산자의 주소 값을 가지는 곳의 주소를 가리킨다.(주소의 주소) 명령어에 나타낼 주소가 명령어 내에서 데이터를 지정하기 위해 할당된 비트 수로 나타낼 수 없을 때 사용한다.
- 레지스터 주소 지정 방식: 주소 부분에 레지스터 번호를 사용하는 방식으로 주소 필드가 작아도 되며 속도가 매우 빠르나, 레지스터 개수에 제한이 있다.
- 레지스터 간접 주소 지정 방식: 명령어의 주소 필드는 레지스터를 가르키고, 레지스터는 메인 메모리에 있는 피연산자의 주소값을 가지는 방식이다.
- 변위 주소 지정 방식: 어떤 주소를 기준으로 주소를 매기는 방식으로 최종 주소를 결정하기 위해 기준값과 변위값을 같이 사용한다. 이때, 기준값으로 사용하는 레지스터의 종류에 따라 "상대 주소 지정 방식", "인덱스 주소 지정 방식", "베이스 레지스터 주소 지정 방식"으로 나뉜다.
댓글