이 글은 한빛미디어 출판사의 '혼자 공부하는 컴퓨터 구조+운영체제(강민철 저)'를 정리한 내용입니다.
명령어: 연산 코드 + 오퍼랜드
연산코드(= 연산자): 명령어가 수행할 연산
오퍼랜드(= 피연산자): 연산에 사용할 데이터, 연산에 사용할 데이터가 저장된 위치
연산 코드 필드: 연산 코드가 담기는 영역
오퍼랜드 필드: 오퍼랜드가 담기는 영역
오퍼랜드는 '연산에 사용할 데이터' 혹은 '연산에 사용할 데이터가 저장된 위치'를 의미한다. 하지만 오퍼랜드 필드에는 대부분의 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담긴다. 그래서 오퍼랜드 필드를 '주소 필드'라고 부르기도 한다.
오퍼랜드는 명령어에 아예 안 담길 수도 있고, 1개만 있을 수도 있고 2개, 3개가 있을 수도 있다.
이 때 오퍼랜드가 하나도 없는 명령어는 0-주소 명령어, 1개인 명령어는 1-주소 명령어, 2개인 명령어는 2-주소 명령어, 3개인 명령어는 3-주소 명령어라고 한다.
명령어의 크기는 무한대가 아니라 정해져 있기 때문에 1-주소 명령어는 오퍼랜드 필드에 가장 많은 공간을 할당할 수 있고, 3-주소 명령어는 오퍼랜드 필드에 할당할 수 있는 공간이 더 작다.
기본적인 연산 코드의 유형은 크게 4가지로 분류가 가능하다.
1. 데이터 전송
2. 산술/논리 연산
3. 제어 흐름 변경
4. 입출력 제어
명령어의 종류와 생김새는 CPU마다 다르기 때문에 연산 코드의 종류와 생김새 또한 CPU마다 다르다
오퍼랜드 필드에 위치 주소가 아닌 데이터가 담기고, 명령어의 크기가 16비트이고 연산 코드 필드가 4비트인 2-주소 명령어가 있다고 해보자. 연산 코드 4비트를 빼고나면 12비트가 남기 때문에 오퍼랜드 필드 하나당 6비트가 할당이 된다. 즉, 하나의 오퍼랜드 필드에서 표현할 수 있는 정보의 가짓수는 2의 6제곱 개이다.
그러나 오퍼랜드 필드에 주소가 담긴다면, 표현할 수 있는 정보의 크기는 하나의 메모리 주소 공간만큼 커진다.
예를 들어, 한 주소에 16비트를 저장할 수 있는 메모리가 있다고 해보자. 이 메모리에 데이터를 저장하고 오퍼랜드 필드 안에 이 메모리 주소를 명시한다면 표현할 수 있는 데이터의 가짓수는 2의 16제곱 개이다.
이 때 연산의 대상이 되는 데이터가 저장된 위치를 '유효 주소'라고 한다.
위와 같이 오퍼랜드 필드에 데이터가 담긴 위치를 명시할 때, 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 한다. 다르게 말하면 주소 지정 방식은 유효 주소를 찾는 방법이다.
연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식.
오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
유효 주소의 주소를 오퍼랜드 필드에 명시
연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시
연산에 사용할 데이터를 메모리에 저장하고, 이 메모리의 주소(유효 주소)를 레지스터에 저장한 다음 오퍼랜드 필드에 이 레지스터 주소를 명시하는 방법
대표적인 주소 지정 방식 5가지
1. 즉시 주소 지정 방식: 데이터 직접 명시
2. 직접 주소 지정 방식: 데이터가 담긴 메모리 주소(유효 주소) 명시
3. 간접 주소 지정 방식: 유효 주소의 주소 명시
4. 레지스터 주소 지정 방식: 데이터가 담긴 레지스터 주소(유효 주소)를 명시
5. 레지스터 간접 주소 지정 방식: 유효 주소가 담긴 레지스터 주소 명시
스택: 한쪽 끝이 막혀 있는 통과 같은 저장 공간.
큐: 양쪽이 뚫려있는 통과 같은 저장 공간
출처 - '혼자 공부하는 컴퓨터 구조+운영체제(한빛미디어, 강민철 저)'