명령어는 연산코드와 오퍼랜드로 구성되어 있다.
연산코드(operation code) : 명령어가 수행할 연산, 연산자
오퍼랜드(operand) : 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치, 피연산자
| 연산코드 | 오퍼랜드 |
오퍼랜드
오퍼랜드 필드에는 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있다. 다만 오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기보다는, 많은 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담긴다. 오퍼랜드 필드를 다른말로 주소필드라고 부른다.
오퍼랜드 명령어 안에는 하나도 없을 수 있고, 한대만 있을 수 있고, 두개 또는 세개가 있을 수 있다.
mov eax, 0 -> 오퍼랜드 두 개의 경우
pop rbp -> 오퍼랜드가 하나의 경우
ret -> 오퍼랜드 X
오퍼랜드가 하나도 없는 명령어 : 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 : 두 개의 숫자 또는 TURE / FALSE 값을 비교하라
제어 흐름 변경
- JUMP : 특정 주소로 실행 순서를 옮겨라
- CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
- HALT : 프로그램의 실행을 멈춰라
- CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
- RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
입출력 제어
- READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
- WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라
- START IO : 입출력 장치를 시작하라
- TEST IO : 입출력 장치의 상태를 확인하라
주소 지정 방식
이런 의문이 들 수 있다. 오퍼랜드 필드에 메모리나 레지스터의 주소를 담지 않고, 연산코드, 연산코드에 사용될 데이터 형식으로 명령어를 구성하면 되지 않을까? 란 생각. 하지만, 이는 명령어 길이 때문에 불가하다.
하나의 명령어가 n비트로 구성되어 있고, 그중 연산 코드 필드가 m비트라고 가정한다면,
공간을 가장 많이 할당할 수 있는 1-주소 명령어라할지라도
오퍼랜드 필드의 길이는 연산 코드만큼의 길이를 뺀 n-m비트가 된다. 오퍼랜드가 늘어 날수록 오퍼랜드 필드의 크기는 작아진다.
예를들면 명령어의 크기가 16비트고, 연산 코드 필드가 4비트인 2-주소 명령어에서는 오퍼랜드 필드당 6비트 정도 밖에 남지 않는다.
| 4 | 6 | 6 |
| 연산코드 | 오퍼랜드 | 오퍼랜드 |
하지만 만약 오퍼랜드 필드에 메모리 주소가 담긴다면, 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커진다.
만약 16비트라면, 오퍼랜드 필드마다 2의16승의 메모리를 통해 저장될 수 있다. 메모리 주소가 아닌 레지스터의 이름을 명시할 때도 마찬가지다.
연산 코드에 사용할 데이터가 저장된 위치, 즉 연산의 대상이 되는 데이터가 저장된 위치를 유효주소(effective address)라고 한다.
이렇게 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식(addressing mode)라고 한다.
- 즉시 주소 지정 방식 : 오퍼랜드 필드에 직접 명시하는 방식
- 데이터 크기가 작아지는 단점, 하지만 메모리나 레지스터로부터 찾는 과정이 없기 때문에 빠르다.
- 직접 주소 지정 방식 : 오퍼랜드 필드에 유효주소를 직접적으로 명시하는 방식
- 데이터 크기가 커졌지만, 표현할 수 있는 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소에 제한
- 간접 주소 지정 방식 : 유효 주소의 주소를 오퍼랜드 필드에 명시한다.
- 느리다
- 레지스터 주소 지정 방식 : 오퍼랜드 필드에 직접 명시하는 방법으로 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있다.
- 직접 주소 지정 방식처럼 레지스터 크기에 제한이 생길 수 있다.
- 레지스터 간접 주소 지정 방식 : 연산에 사용할 데이터를 메모리에 저장하고, 그 유효주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법
- 메모리에 접근 횟수가 한 번으로 줄어든다는 장점이 있고, 간접 주소 지정 방식보다 빠르다.
'혼자 공부하는 컴퓨터구조 + 운영체제' 카테고리의 다른 글
| 명령어 사이클과 인터럽트 (0) | 2022.10.05 |
|---|---|
| CPU 작동원리 (0) | 2022.10.05 |
| 소스코드와 명령어 (0) | 2022.09.27 |
| 데이터 (0) | 2022.09.25 |
| 컴퓨터 구조와 운영체제 왜 공부해야할까? (0) | 2022.09.24 |