하나의 명령어를 자세히 들여다보며
연산 코드, 오퍼랜드, 주소 지정 방식이라는 개념에 대해 알아보자.
<Intro>
*명령어는 '무엇을 대상으로', '어떤 작동을 수행하라'는 구조로 되어 있다.
*명령어는 연산코드와 오퍼랜드로 구성되어 있다.
<명령어>
● 연산코드(operation code) : 명령어가 수행할 연산(작동)
● 오퍼랜드(operand) : 연산에 사용할 데이터 or 연산에 사용할 데이터의 위치
*연산코드는 '연산자', 오퍼랜드는 '피연산자'라고 부른다.
● 연산코드 필드 : 연산 코드가 담기는 영역
● 오퍼랜드 필드 : 오퍼랜드가 담기는 영역
* 명령어의 종류와 생김새는 CPU마다 다르다. (따라서 연산 코드의 종류와 생김새도 CPU마다 다르다.)
<오퍼랜드(operand)>
● 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치를 의미
● 오퍼랜드 필드에는 숫자와 문자 등을 나타내는 데이터 or 메모리 or 레지스터 주소가 올 수 있다.
● 오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기 보다는, 많은 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담긴다.
● 그래서 오퍼랜드 필드를 '주소 필드'라고 부르기도 한다.
● 오퍼랜드는 명령어 안에 하나도 없을 수도 있고, 한 개만 있을 수도 ㅇㅆ고, 두 개 또는 세 개 등 여러 개가 있을 수도 있다.
*0-주소 명령어 : 오퍼랜드가 하나도 없는 명령어
*1-주소 명령어 : 오퍼랜드가 한 개인 명령어
*2-주소 명령어 : 오퍼랜드가 두 개인 명령어
*3-주소 명령어 : 오퍼랜드가 세 개인 명령어
<연산코드(operation code)>
● 명령어가 수행할 연산을 의미한다.
● 기본적인 연산 코드 유형은 크게 네 가지다.(이 외에도 매우 다양한 종류가 존재)
* 데이터 전송
* 산술/논리 연산
* 제어 흐름 변경
* 입출력 제어
<주소 지정 방식>
● "왜 operand 필드에 메모리나 레지스터의 주소를 담는 건가요? 그냥 <연산 코드, 연산 코드에 사용될 데이터> 형식으로 명령어를 구성하면 되지 않나요?"
이는 명령어의 길이 때문이다. 명령어(오퍼랜드)에 데이터를 바로 담는다면 그 오퍼랜드의 데이터 크기만큼만 data를 담을 수 있지만, 주소 정보를 연결하면 그 연결된 주소의 공간까지 사용할 수 있게 된다. 즉 오퍼랜드 필도르ㅗ 표현할 수 있는 데이터 크기가 커진다.
● 연산코드에 사용할 데이터가 저장된 위치, 즉, 연산의 대상이 되는 데이터가 저장된 위치를 '유효주소(effective address'라고 한다. 만약 어떤 오퍼랜드가 10번지라는 메모리 주소를 명시하거나, R1이라는 레지스터를 명시한다면 그 10번지나 R1이 유효주소가 된다.
● 주소 지정 방식(addressing mode) : 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 한다. 다시 말해, 주소 지정 방식은 유효 주소를 찾는 방법이다.
● 현재 CPU는 다양한 주소 지정 방식을 사용한다. 대표적인 주소 지정 방식에는 5가지가 있다.
*즉시주소지정방식(immediate addressing mode) : 오퍼랜드 필드에 주소가 아니라 연산에 사용할 데이터를 바로 명시. 표현할 수 있는 데이터의 크기가 작아지지만, 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 괒어이 없기 때문에 다른 방식들보다 빠르다.
*직접주소지정방식(direct addressing mode) : 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방법. 오퍼랜드에서 표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식보다 더 커졌지만, 여전히 유효 주소를 표현할 수 있는 범위는 연산 코드의 비트 수만큼 줄어든다.
*간접주소지정방식(indirect addressing mode) : 유효주소의 주소를 오퍼랜드 필드에 명시한다. 앞서 설명한 것들보단 느리지만, 직접 주소 지정 방식보다 표현할 수 있는 유효주소의 범위가 넓어진다.
*레지스터 주소 지정 방식(resgister addressing mode) : 직접 주소 지정방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드필드에 직접 명시하는 방법이다. 일반적으로 CPU 외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르다. 그러므로 레지스터 주소 지정 방식은 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있다. 다만 직접 주소 지정 방식과 비슷한 문제로, 표현할 수 있는 레지스터 크기에 제한이 생길 수 있다.
* 레지스터 간접 주소 지정 방식(register indirect addressing mode)은 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법.
주소 지정 방식 | operand field에 명시하는 값 |
즉시 주소 지정 방식 | 연산에 사용할 데이터 |
직접 주소 지정 방식 | 유효 주소(메모리 주소) |
간접 주소 지정 방식 | 유효 주소의 주소 |
레지스터 주소 지정 방식 | 유효 주소(레지스터 이름) |
레지스터 간접 주소 지정 방식 | 유효주소를 저장한 레지스터 |
<작성 참고자료>
혼자 공부하는 컴퓨터 구조+운영체제(지은이 강민철)
'공대생 김모립 > 컴퓨터구조' 카테고리의 다른 글
ALU와 제어장치 (0) | 2023.04.10 |
---|---|
(1) 컴퓨터 구조 개관 (0) | 2023.03.29 |
(0) 컴퓨터구조를 배워야 하는 이유 (0) | 2023.03.29 |