기계어와 어셈블리어를 이루는 하나하나는 명령어이다. 이번 포스팅과 다음 포스팅에서 이 하나의 명령어를 자세히 들여다보면서 연산 코드, 오퍼랜드, 주소 지정 방식이라는 개념에 대해서 정리해보려 한다.
명령어는 '무엇을 대상으로, 어떤 작동을 수행하라.'라는 구조로 되어있다. 즉, 연산 코드와 오퍼랜드로 구성되어 있는데, '명령어가 수행할 연산'을 연산 코드라고 하고, '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 오퍼랜드라고 한다. 또한 연산 코드를 연산자라고 하기도 하고, 오퍼랜드를 피연산자라고 하기도 한다.
그럼 우선 오퍼랜드부터 자세히 알아보자.
오퍼랜드
오퍼랜드가 담기는 영역을 오퍼랜드 필드라고 한다. 그래서 오퍼랜드 필드에는 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있다. 다만 오퍼랜드 필드에는 데이터를 직접 명시하기 보다는, 많은 경우에 연산에 사용할 데이터가 저장된 위치. 즉, 메모리 주소나 레지스터 이름이 담기는데, 그래서 오퍼랜드 필드를 주소 필드라고 부르기도 한다.
이런 오퍼랜드는 명령어 안에 하나도 없을 수도 있고, 한 개만 있을 수도 있고, 2개 또는 3개 등 여러 개가 있을 수도 있다. 여기서 오퍼랜드가 하나도 없는 명령어를 0-주소 명령어, 하나인 명령어를 1-주소 명령어, 2개인 명령어를 2-주소 명령어, 3개인 주소 명령어를 3-주소 명령어라고 한다.
연산 코드
연산 코드는 명령어가 수행할 연산을 의미한다고 했다. 이런 연산의 종류에는 더해라, 빼라, 저장해라 등이 있을 수 있겠다. 그러면 이런 연산 코드의 종류를 크게 4가지 종류로 나누면 다음과 같이 나눌 수 있겠다.
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경
- 입출력 제어
이제 각 유형에 따른 대표적인 연산 코드를 살펴볼텐데, 명령어의 종류와 생김새는 CPU마다 다르고, 연산 코드의 종류와 생김새 또한 CPU 마다 다르다는 것을 유의하면서 대부분의 CPU가 공통으로 이해하는 대표적인 연산 코드의 종류로만 이해해보자.
데이터 전송
- MOVE : 데이터를 옮긴다.
- STORE : 메모리에 저장한다.
- LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져온다.
- PUSH : 스택에 데이터를 저장한다.
- POP : 스택의 최상단 데이터를 가져온다.
산술/논리 연산
- ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행하라.
- INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라
- AND / OR / NOT : AND / OR / NOT 연산을 수행하라
제어 흐름 변경
- JUMP : 특정 주소로 실행 순서를 옮긴다.
- CONDITIONAL JUMP : 조건에 부합할 때, 특정 주소로 실행 순서를 옮긴다.
- HALT : 프로그램의 실행을 멈춘다.
- CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮긴다.
- RETURN : CALL을 호출할 때 저장했던 주소로 돌아간다.
입출력 제어
- READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽는다.
- WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라.
- START IO : 입출력 장치를 시작하라.
- TEST IO : 입출력 장치의 상태를 확인하라.
'컴퓨터 사이언스 > 컴퓨터 구조' 카테고리의 다른 글
명령어 사이클 (0) | 2023.11.15 |
---|---|
레지스터의 역할과 종류 (0) | 2023.11.15 |
Segmentation과 Paging의 개념 및 장단점 정리 (0) | 2023.11.14 |
주소 지정 방식 (0) | 2023.11.11 |