CS

[컴퓨터 구조 기초] 명령어의 구조와 주소지정 방식

dev-ohdam 2024. 6. 6. 22:08

명령어는 어떻게 구성되어 있는가?

 명령어는 컴퓨터가 이해 하는 정보 중 하나이다.

우리가 동작시키는 모든 프로그램들은 명령어의 형태로 메모리에 저장되며, CPU는 이 명령어를 가져와 해석하고

실행하는 과정을 수행한다. 그렇다면 이 명령어들은 어떻게 구성되어 있는지 한번 살펴보자.

 명령어는 크게 연산 코드오퍼랜드로 구분할 수 있다.

 

 연산 코드는 말 그대로 수행할 연산에 관한 내용을 담고 있는 부분이다.

대표적인 연산으로는 다음과 같다.

  • 데이터 전송
  • 산술/논리 연산
  • 제어 흐름 변경
  • 입출력 제어

 오퍼랜드는 피연산자이다. 즉 연산을 수행하기 위해 사용하는 데이터를 말한다. 하나가 들어갈 수도 있고 여러 개가 들어갈 수 도 있다. 데이터 값을 그대로 담아 넣어 사용하기도 하지만, 보통은 메모리의 주소나 레지스터의 이름(주소)를 담는다.

왜 데이터 값을 그대로 사용하지 않고 귀찮게 주소를 사용하는가?

 당연히 이런 의문이 들 수 있다. 그냥 데이터값을 바로바로 사용하면 되는데 굳이 주소를 줌으로써 저장장치에

한번 더 접근을 해야한다니.. 굳이 이럴 필요가 있을까?

 

이런 방식을 채택하게 된 이유는 제한적인 명령어의 길이에서 비롯된다.

 

제한적인 명령어의 길이

 CPU가 처리하는 명령어의 길이는 동일한 규격인 것이 좋다. (파이프라이닝과 같은 명령어 처리 기법과 연관되어 있다.)

그렇기 때문에 일정 크기만큼 명령어의 길이를 제한하게 된다.

 

여기서 명령어의 크기가 N bit 라고 가정해보자.

 

 연산 코드는 모든 크기가 일정하다.

 

 이를 M bit라고 했을 때, 남은 공간은 N - M bit 만큼의 공간이 될 것이다.

그렇다면 우리는 오퍼랜드를 (N - M) bit 공간에 담아 내야한다는 것이다. 오퍼랜드의 갯수가 1개라면 충분할 수 있지만, 상황에 따라 여러 개의 오퍼랜드를 담아야한다면 그 크기는 더욱 줄어들 것이다. 

 

 이렇게 되면 우리가 오퍼랜드를 통해 표현할 수 있는 데이터의 길이는 제한될 것이다.

하지만 주소를 사용하게 된다면? 오퍼랜드에 주소를 담고, 해당 주소에 접근하는 방식을 채택하게 된다면,

우리는 실질적으로 해당 주소에 저장할 수 있는 데이터의 크기만큼 데이터를 표현할 수 있게된다.

 

주소지정방식 채택 이유 (해당 사진은 직접주소지정방식 이다.)

 

이때 오퍼랜드에 들어간 실제 데이터가 저장된 주소를 유효 주소(EA)라고 한다.

그리고 이렇게 오퍼랜드에 들어갈 데이터를 다양한 주소의 형태로 지정하는 방식을 주소지정 방식이라고 한다.

 

주소지정 방식

주소지정 방식에도 여러 가지 종류가 있는데, 대표적인 것은 다음과 같다. 여기서 데이터 값은 (명령어 혹은 데이터값을 통합적으로 일컫는 말이다.)

  • 즉시 주소지정 방식 : 오퍼랜드에 데이터 값을 그대로 넣는 방식이다.

  • 직접 주소지정 방식:  오퍼랜드에 데이터의 유효 주소를 넣는 방식이다. 

 하지만 이 방식에도 단점이 존재하는데, 데이터의 유효 주소를 표현할 수 있는 길이가 제한된다는 점이다.

이 단점을 극복하기 위해 간접주소지정방식이 등장했다.

 

  • 간접 주소지정 방식:  오퍼랜드에 데이터의 유효 주소를 담은 메모리의 주소를 넣는 방식이다.

 이렇게 구현하게 된다면, 유효 주소를 표현할 수 있는 공간의 크기가, 오퍼랜드에 들어간 메모리 주소의 공간 크기만 큼 커진다는 장점이 있다.

하지만 메모리를 2번 접근 해야한다는 단점이 있다.

 

레지스터를 이용한 주소지정방식

  • 레지스터 주소지정 방식 : 오퍼랜드에 데이터값을 가지고 있는 레지스터의 이름(주소)을 담는 방식.

 

 

  • 레지스터 간접 주소지정 방식 : 오퍼랜드에 유효 주소를 저장한 레지스터의 이름(주소)를 담는 방식.

  • 스택 포인터 주소지정 방식 : SP라는 특수한 레지스터를 이용한 주소지정 방식.
    SP는 스택 메모리의 맨 위의 주소를 가지고 있으며, 데이터의 PUSH/POP 현상이 일어날 때마다, 해당 주소를 제어하여 변경한다. 

     스택 데이터를 효율적으로 관리할 수 있다는 장점을 가지고 있으나, 추가적인 명령어가 요구되어 오버헤드가 발생하는 단점이 있다.

레지스터를 이용한 주소지정 방식(2) - 변위주소지정 방식

 변위 주소지정 방식이란 EA(유효 주소) = 변위값 + 레지스터에 저장된 값의 구조로, 
레지스터에 저장된 값에 변위값을 더한 주소에 참조하는 방식이다.

명령어의 구조는 연산 코드 | 레지스터 이름 | 변위값 으로 구성된다. 

  • 상대 주소지정 방식 : 프로그램카운터 레지스터에 저장된 명령어 위치 값변위값을 더한 주소에 접근하는 방식. 

 

 예를 들어 상대주소지정방식을 사용하는 명령어가 310번지에 있고, 이 변위값이 30이라면,

 해당 명령어를 인출하기 전, 프로그램카운터 레지스터에는 310값이 들어있을 것이다.
그렇다면 최종적으로 해당 명령어가 접근하는 주소는

 310 + 1(명령어 인출로 인한 프로그램 카운터 레지스터값 증가) + 30 = 341번지 

이다.

 

  • 인덱스 주소지정 방식 : 인덱스 레지스터의 값과 변위값을 더한 주소에 접근하는 방식이다. 배열 데이터 접근 시, 자동으로 인덱싱되기 때문에, 명령어를 실행할 때마다 인덱스 레지스터 값이 자동으로 갱신된다.

    배열 데이터에 효율적인 접근이 가능하다는 장점이 있다.

  • 베이스 레지스터 주소지정 방식 : 베이스 레지스터에 기준 주소값이 들어있으며, 오퍼랜드에 들어있는 변위값을 더한 유효 주소에 접근하는 방식이다.
     
     이때 베이스 레지스터에는 메모리에 저장된 데이터 값의 시작 주소를 담고 있다. 

 

 인덱스 주소지정 방식과 베이스 레지스터 주소지정 방식을 조금 더, 비교해보자면
베이스 레지스터 주소지정 방식은 변위값이 고정된 값인 반면, 인덱스 주소지정 방식은 변위값이 유동적으로 바뀐다는 점이 있다. 

'CS' 카테고리의 다른 글

[컴퓨터 구조 기초] 컴퓨터와 명령어  (0) 2024.06.03
[컴퓨터 구조 기초] 컴퓨터의 핵심 부품  (0) 2024.06.02