명령어의 구조와 주소 지정 방식을 학습하며 명령어의 생김새와 작동 원리를 알아보자❗
1️⃣ 연산 코드와 오퍼랜드
컴퓨터 속 명령어는 '무엇을 대상으로, 어떤 동작을 수행하라'는 구조로 되어 있다. 아래의 그림을 보면 색 배경 필드는 명령어의 '작동', 달리 말해 '연산'을 담고 있고 흰색 배경 필드는 '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 담고 있다.
명령어는 연산 코드와 오퍼랜드로 구성되어 있다.
색 배경 필드 값, 즉 '명령어가 수행할 연산'을 연산 코드operation code라 하고,
흰색 배경 필드 값, 즉 '연산에 사용될 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 오퍼랜드operand라고 한다.
연산 코드는 연산자, 오퍼랜드는 피연산자라고도 부르기도 한다.
또한, 연산 코드가 담기는 영역을 연산 코드 필드라고 부르고, 오퍼랜드가 담기는 영역을 오퍼랜드 필드라고 한다.
1) 오퍼랜드
오퍼랜드는 '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 의미한다. 오퍼랜드 필드에는 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있다. 다만 오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기보다 대부분의 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담긴다.
오퍼랜드는 명령어 안에 하나도 없을 수도 있고, 한 개만 있을 수도 있고, 두 개 또는 세 개 등 여러 개가 있을 수도 있다.
mov eax, 0 -> 오퍼랜드 두개
pop rbp -> 오퍼랜드 한개
ret -> 오퍼랜드 없음
이처럼 오퍼랜드가 하나도 없는 명령어를 0-주소 명령어라고 하고, 오퍼랜드가 하나인 명령어를 1-주소 명령어, 두 개인 명령어를 2-주소 명령어, 세 개인 명령어를 3-주소 명령어라고 한다.
2) 연산 코드
연산 코드 종류는 많지만, 가장 기본 적인 연산 코드 유형은 크게 네 가지가 있다.
① 데이터 전송
② 산술/논리 연산
③ 제어 흐름 변경
④ 입출력 제어
명령어의 종류와 생김새는 CPU마다 다르기 때문에 연산 코드의 종류와 생김새 또한 CPU마다 다르다.
아래는 CPU가 공통으로 이해하는 대표적인 연산 코드의 종류 정도로 이해하자.
데이터 전송
● MOVE : 데이터를 옮겨라
● STORE : 메모리에 저장하라
● LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
● PUSH : 스택에 데이터를 저장하라
● POP : 스택의 최상단 데이터를 가져와라
산술/논리 연산
● ADD / SUBTRACT / MULTIPLY / DIVIDE : 사칙연산 수행
● INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라
● AND / OR / NOT : AND OR NOT 연산을 수행
● COMPARE : 두 개의 숫자 또는 TRUE / FALSE 값을 비교
제어 흐름 변경
● JUMP : 특정 주소로 실행 순서를 옮겨라
● CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
● HALT : 프로그램의 실행을 멈춰라
● CALL : 되돌아올 주소를 저장할 채 특정 주소로 실행 순서를 옮겨라
● RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
입출력 제어
● READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
● WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라
● START IO : 입출력 장치를 시작하라
● TEST IO : 입출력 장치의 상태를 확인하라
2️⃣ 주소 지정 방식
명령어의 오퍼랜드 필드에 메모리나 레지스터의 주소를 담는 경우가 많다. 그래서 오퍼랜드 필드를 주소 필드라고 부르기도 한다. 그럼 왜 오퍼랜드 필드에 메모리나 레지스터의 주소를 담는건가?
명령어 구성을 <연산 코드, 연산 코드에 사용될 데이터> 형식으로 명령어를 구성하면 되지 않을까?
이는 명령어의 길이 때문에 오퍼랜드 필드에 구성하는 것이다.
명령어가 n비트로 구성이 되어있고, 그중 연산 코드 필드가 m비트라고 가정하면,
오퍼랜드 필드에 가장 많은 공간을 할당할 수 있는 1-주소 명령어라고 할지라도 오퍼랜드 필드의 길이는 연산 코드만큼의 길이를 뺀 n-m비트가 된다. 2-주소, 3-주소 명령어라면 오퍼랜드 필드의 크기는 더욱 작아진다.
명령어의 크기가 16비트, 연산 코드 필드가 4비트인 2-주소 명령어에서는 오퍼랜드 필드당 6비트 정도밖에 남지 않는다.
즉, 하나의 오퍼랜드 필드로 표현할 수 있는 정보의 가짓수는 26개밖에 되지 않는다.
명령어의 크기가 16비트, 연산 코드 필드가 4비트인 3-주소 명령어에서는 오퍼랜드 필드당 4비트 정도밖에 남지 않는다. 이 경우 하나의 오퍼랜드 필드로 표현할 수 있는 정보의 가짓수는 24개 밖에 없다.
💥하지만 만약 오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커진다.
예를 들어 16비트를 저장할 수 있는 메모리가 있다고 가정을 해보자.
이 메모리 안에 데이터를 저장하고, 오퍼랜드 필드 안에 해당 메모리 주소를 명시한다면 표현할 수 있는 정보의 가짓수가 216으로 커질 것이다.
오퍼랜드 필드에 메모리 주소가 아닌 레지스터 이름을 명시할 때도 마찬가지이다. 이 경우 표현할 수 있는 정보의 가짓수는 해당 레지스터가 저장할 수 있는 공간만큼 커진다.
연산 코드에 사용할 데이터가 저장된 위치, 연산의 대상이 되는 데이터가 저장된 위치를 유효 주소effective address라고 한다. 위 그림의 경우 유효주소는 10번지가 된다.
이렇게 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식addressing mode이라고 한다. -> 주소 지정 방식 : 유효 주소 찾기
다음 포스팅에서는 다양한 주소 지정 방식에 대해서 작성을 해보도록 하자.
참고자료 -
혼자 공부하는 컴퓨터구조 + 운영체제 / 한빛미디어
image -
https://www.flaticon.com/kr/free-icon/hierarchy_4767982?term=%EA%B5%AC%EC%A1%B0&page=1&position=71&origin=search&related_id=4767982
'CS' 카테고리의 다른 글
[CS] ALU와 제어장치 (0) | 2023.01.31 |
---|---|
[CS] 다양한 주소 지정 방식 (0) | 2023.01.19 |
[CS] 소스코드와 명령어 (0) | 2023.01.14 |
[CS] 0과 1로 문자를 표현하는 방법 (0) | 2023.01.12 |
[CS] 0과 1로 숫자를 표현하는 방법 (0) | 2023.01.10 |