🤔 연산코드와 오퍼랜드
우리는 누군가에게 명령을 할 때(부탁을 할 때) 아래와 같이 말할 겁니다
"엄마, 나 밥 좀 줘."
"윤서야, 빨래 좀 개줘~"
컴퓨터 속 명령어도 우리와 똑같다고 할 수 있다 ! 좀 더 알아보자~
👄 명령어
명령어는 연산코드와 오퍼랜드로 이루어져 있습니다.
연산코드와 오퍼랜드에 관한 설명은 사진으로 표현해봤습니당~ 이해하기 더 쉽죠??
이 사진과 같이 연산코드가 담기는 영역을 '연산 코드 필드' 라고 부르고,
오퍼랜드가 담긴 영역을 '오퍼랜드 필드' 라고 합니다.
📍 오퍼랜드
자! 이제 오퍼랜드에 대해 좀 더 자세히 알아봅시당
오퍼랜드 : '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'
-> 그래서 오퍼랜드 필드에는 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있습니다. (연산에 사용할 데이터를 직접 명시하기보다는, 많은 경우로 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담깁니다.)
-> 그래서 오퍼랜드 필드를 주소 필드라고 부르기도 합니다.
밑 사진과 같이 오퍼랜드는 명령어 안에 하나도 없을 수 있고, 한 개만 있을 수 있고, 두 개 또는 세 개 등 여러 개가 있을 수 있다.
🧮 연산 코드
오퍼랜드에 대해 알아봤다면 연산 코드에 대해서도 알아봐야겠죵
연산 코드 : 명령어가 수행할 연산
✏️ 가장 기본적인 연산 코드 유형
1️⃣ 데이터 전송
2️⃣ 산술/논리 연산
3️⃣ 제어 흐름 변경
4️⃣ 입출력 제어
✏️ 대표적인 연산 코드
1️⃣ 데이터 전송
- MOVE : 데이터를 옮겨라
- STORE : 메모리를 저장하라
- LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
- PUSH : 스택에 데이터를 저장하라
- POP : 스택의 최상단 데이터를 가져와라
2️⃣ 산술/논리 연산
- ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행하라
- INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라
- AND / OR / NOT : AND / OR / NOT 연산을 수행하라
- COMPARE : 두 개의 숫자 또는 TRUE / FALSE 값을 비교해라
3️⃣ 제어 흐름 변경
- JUMP : 특정 주소로 실행 순서를 옮겨라
- CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
- HALT : 프로그램의 실행을 멈춰라
- CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
- RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
4️⃣ 입출력 제어
- READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
- WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라
- START IO : 입출력 장치를 시작하라
- TEST IO : 입출력 장치의 상태를 확인하라
📇 주소 지정 방식
주소 지정 방식 : 연산에 사용할 데이터 위치를 찾는 방법 (유효 주소를 찾는 방법)
만약 오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커집니다. (오퍼랜드 필드 안에 해당 메모리 주소를 명시한다면 표현할 수 있는 정보의 가짓수가 커짐)
레지스터도 마찬가지로 표현할 수 있는 정보의 가짓수는 해당 레지스터가 저장할 수 있는 공간만큼 커진다.
📇 주소 지정 방식 5가지
1️⃣ 즉시 주소 지정 방식 : 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
- 단점 : 표현할 수 있는 데이터의 크기가 작아짐
- 장점 : 빠르다. (연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문)
2️⃣ 직접 주소 지정 방식 : 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
- 단점 : 표현할 수 있는 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소에 제한이 생길 수 있음
3️⃣ 간접 주소 지정 방식 : 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식
- 단점 : 느리다. (두 번의 메모리 접근이 필요하기 때문)
4️⃣ 레지스터 주소 지정 방식 : 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방식 (직접 주소 지정 방식과 비슷함)
- 단점 : 표현할 수 있는 레지스터 크기에 제한이 생길 수 있음 (직접 주소 지정 방식과 비슷한 문제)
- 장점 : 직접 주소 지정 방식부다 빠르게 데이터에 접근 가능
5️⃣ 레지스터 간접 주소 지정 방식 : 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 오퍼랜드 필드에 명시하는 방식
- 장점 : 간접 주소 지정 방식보다 빠르다. (메모리에 접근하는 횟수가 한 번으로 줄어듬)
✨ 정리 ( 오퍼랜드에 들어간 것(빠른순) )
- 즉시 주소 지정 방식 : 연산에 사용할 데이터
- 레지스터 주소 지정 방식 : 유효 주소 (레지스터 이름)
- 직접 주소 지정 방식 : 유효 주소 (메모리 주소)
- 레지스터 간접 주소 지정 방식 : 유효 주소를 저장한 레지스터
- 간접 주소 지정 방식 : 유효 주소의 주소
☀️ 좀 더 알아보기
스택(stack) : 한쪽 끝이 막혀 있는 통과 같은 저장 공간
- LIFO (Last In First Out) : 후입선출
큐 (queue) : 양쪽이 뚫려 있는 통과 같은 저장 공간
- FIFO ( Fist In First Out) : 선입선출