-
명령어의 구조
- 명령어는 연산코드와 오퍼랜드로 구성되어 있다
연산코드 : 명령어가 수행할 연산
오퍼랜드 : 연산에 사용할 데이터가 저장된 위치
연산코드와 오퍼랜드 이미지 - 연산코드 영역을 연산코드 필드
- 오퍼랜드 영역을 오퍼랜드 필드 라고 한다
오퍼랜드
- 오퍼랜드는 '연산에 사용할 데이터' '연산에 사용할 데이터가 저장된 위치'를 의미하는데, 오퍼랜드 필드에는 숫자 문자를 나타내는 데이터, 메모리나 레지스터 주소가 올 수 있다.
- 다만 오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기 보다 연산에 사용할 데이터가 저장된 위치, 메모리 주소 레지스터 이름이 담긴다 -> 그래서 주소 필드 라고 부른다

- 오퍼랜드 명령어는 없을수도 있고 1-3개 등 있을수 있다고 한다.
- 또한 오퍼랜드가 1개도 없다면 0주소 명령어 1개가 있다면 1주소 명령어 2개 있다면 2주소 명령어라고 한다.
연산코드
- 연산코드는 명령어가 수행할 연산을 의미한다.
- 연산코드의 대표적 종류 4가지
1. 데이터 전송
2. 산술/논리 연산
3. 제어 흐름 변경
4. 입출력 제어주소 지정방식
- 앞서 명령어 오퍼랜드 필드에 레지스터의 주소를 담는 경우가 많다고 하는데, 왜 오퍼랜드 필드에 주소를 넣을까 생각이 들었다 🤔
- 결론부터 말하면 명령어의 길이 때문이다. 하나의 명령어가 n비트로 구성되어 있고, 연산코드가 m비트라고 가정하면 ,1주소 명령어를 사용한다고 가정하면 오퍼랜드 길이는 연산코드의 길이를 뺀 n-m 비트가 된다.
- 2주소 명령어 3주소 명령어가 될 수록 더욱이 값을 저장할 공간이 줄어든다.

- 사진을 보면 한 주소에 4비트씩 오퍼랜드 필드에 저장이 가능했지만 메모리에 저장하니 16비트를 저장이 가능해 정보의 가짓수가 증가한 것을 볼 수 있다
- 오퍼랜드 필드에 메모리가 아닌 레지스터 이름 명시할 때도 마찬가지이다. 레지스터 공간만큼 정보의 가짓수가 증가했다.

- 연산코드에 사용할 데이터가 저장된 위치, 연산이 되는 데이터가 저장된 위치를 유효 주소 라고 한다
- 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 한다
즉시 주소 지정방식

연산코드와 오퍼랜드 이미지 - 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식이다. 이 방식은 표현할 수 있는 데이터의 크기가 작아질 수 있지만, 데이터를 메모리, 레지스터에 찾을 필요가 없어 빠르다는 장점이 있다.
직접 주소 지정방식
- 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식이다. 데이터의 크기는 더욱 커졌지만 오퍼랜드 필드의 길이가 연산코드 길이만큼 짧아져 유효 주소에 제한이 생길 수 있다.

간접 주소 지정방식
- 유효주소의 주소를 오퍼랜드 필드에 명시를 한다. 직접 주소 지정방식보다 유효주소의 범위가 넓어졌다.

레지스터 주소 지정방식
- 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법이다.
- 일반적으로 CPU 외부에 있는 메모리에 접근하는 방법보다 빠르고 직접주소 지정방식과 비슷한 표현할 수 있는 레지스터 크기에 제한이 생길 수 있다는 문제점이 있다.

레지스터 간접 주소 지정방식

- 사용할 데이터를 메모리에 저장하고 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법
- 유효 주소를 찾는 과정이 간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한번으로 감소한다는 차이점이 있다.
- 메모리에 직접 접근하는 방식은 레지스터에 직접 접근하는 방식이 더욱 느리다. 그래서 간접 주소 지정 방식보다는 더욱 빠르다.
정리
- 연산에 사용할 데이터를 찾음 -> 주소 지정 방식
- 연산에 사용할 데이터가 저장된 위치 -> 유효 주소
즉시 주소 지정 방식 : 연산에 사용할 데이터
직접 주소 지정 방식 : 유효 주소(메모리 주소)
간접 주소 지정 방식 : 유효 주소의 주소
레지스터 즉시 주소 지정 방식 : 유효 주소(레지스터 주소)
레지스터 간접 주소 지정 방식 : 유효 주소를 저장한 레지스터