명령어의 구조와 주소 지정 방식에 대해 알아보자!
명령어의 생김새와 작동 원리를 이해하자!
연산 코드와 오퍼랜드
- 명령어는 연산 코드와 오퍼랜드로 구성되어 있다.
- '명령어가 수행할 연산'을 연산코드라 하고, '연산에 사용할 데이터가 저장된 위치'를 오퍼랜드 라고한다.
- 연산코드는 연산자, 오퍼랜드는 피연산자라고 부른다.
- 연산 코드가 담기는 영역을 연산 코드 필드라고 부르고, 오퍼랜드가 담기는 영역을 오퍼랜드 필드라고 부른다.
오퍼랜드
- 오퍼랜드는 '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 의미한다.
- 오퍼랜드 필드에는 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있다.
- 오퍼랜드 필드를 주소 필드라고 부른다.
- 오퍼랜드 명령어 안에 하나도 없을수도, 여러개가 있을 수도 있다.
- 오퍼랜드가 하나도 없는 명령어를 0-주소 명령어라고 하고, 하나인 명령어를 1-주소 명령어, 두 개인 명령어를 2-주소 명령어, 세 개인 명령어를 3-주소 명령어라고 한다.
- 오퍼랜드 필드에는 연산에 사용할 데이터를 직접 명시하기 보다는 많은 경우 데이터가 저장된 위치를 명시한다.
연산코드
- 연산코드의 유형은 크게 네 가지로 나뉜다.
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경
- 입출력 제어
- 데이터 전송
- MOVE : 데이터를 옮겨라
- STORE : 메모리에 저장하라
- LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져오라.
- PUSH : 스택에 데이터를 저장하라
- POP : 스택의 최상단 데이터를 가져와라.
- 산술/논리 연산
- ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈, 뺄셈, 곱셈, 나눗셈을 수행하라
- INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 , 오퍼랜드에 1을 빼라
- AND / OR / NOT : AND, OR, NOT 연산을 수행하라
- COMPARE : 두 개의 숫자 또는 TRUE/ FALSE 값을 비교하라
- 제어 흐름 변경
- JUMP : 특정 주소로 실행 순서를 옮겨라
- CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
- HALT : 프로그램의 실행을 멈춰라
- CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
- RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
- 입출력 제어
- READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라.
- WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라.
- START IO : 입출력 장치를 시작하라.
- TEST IO : 입출력 장치의 상태를 확인하라
주소 지정
연산에 사용할 데이터를 찾는 방법을 주소 지정 방식이라고 하고, 연산에 사용할 데이터가 저장된 위치를 유효 주소라고 한다.
| 지정방식 | 내용 |
|---|
| 즉시 주소 지정 방식 | 연산에 사용할 데이터 |
| 직접 주소 지정 방식 | 유효 주소(메모리 주소) |
| 간접 주소 지정 방식 | 유효 주소의 주소 |
| 레지스터 주소 지정 방식 | 유효 주소(레지스터 이름) |
| 레지스터 간접 주소 지정 방식 | 유효 주소를 저장한 레지스터 |
- 즉시 주소 지정 방식
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
- 데이터의 크기가 작아지는 단점이 있다.
- 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문에 이하 설명할 주소 지정 방식들보다 빠르다.
- 직접 주소 지정 방식
- 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
- 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소 제한이 생길 수 있다.
- 간접 주소 지정 방식
- 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식
- 두 번의 메모리 접그닝 필요하기 때문에 다른 주소 지정 방식들보다 일반적으로 느린 방식이다.
- 레지스터 주소 지정 방식
- 직접 주소 지정 방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법이다.
- 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있다.
- 직접 주소 지정 방식과 비슷한 문제를 공유하므로 표현할 수 있는 레지스터 크기에 제한이 생길 수 있다.
- 레지스터 간접 주소 지정 방식
- 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법이다.
- 유효 주소를 찾는 과정이 간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한 번으로 줄어든다는 장점이 있다.
- 간접 주소 지정 방식보다 빠르다.
스택과 큐
- 스택
- 스택이란, 한쪽 끝이 막혀 있는 통과 같은 저장공간이다.
- 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식(후입선출)이다.
- LIFO구조다.(Last In First Out)
- 새로운 데이터를 저장하는 명령어를 PUSH라고 한다.
- 저장된 데이터를 꺼내는 명령어를 POP이라고 한다.
- 큐
- 스택과 달리, 양쪽으로 뚫려있는 저장공간을 큐라고 한다.
- 가장 먼저 저장된 데이터를 빼내는 데이터 관리 방식(선입선출)이다.
- FIFO구조다.(First In First Out)