본문 바로가기
취준

[컴퓨터 구조] Chapter 3-2 명령어의 구조

by 박매트 2024. 4. 22.

앞서 기계어와 어셈블리어의 형태로 명령어를 접해 봤습니다.

기계어나 어셈블리어를 이루는 하나하나가 명령어라고 했었죠.

 

하지만 아직 기계어나 어셈블리어를 이루는 각각의 명령어를 자세히 들여다보지는 않았습니다.

 

자세히 들여다보며 연산 코드, 오퍼랜드, 주소 지정 방식이라는 개념을 학습해 보겠습니다.

 

연산 코드와 오퍼랜드

 

명령어는 '무엇을 대상으로, 어떤 작동을 수행하라'는 구조로 되어 있습니다.

즉, 연산 코드와 오퍼랜드로 구성되어 있습니다.

 

연산 코드  : 명령어가 수행할 연산

오퍼랜드 : 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치

 

연산 코드는 연산자, 오퍼랜드는 피연산자 라고 부릅니다.

 

연산 코드가 담기는 영역을 연산 코드 필드라고 부르고, 

색칠되지 않은 부분, 즉 오퍼랜드가 담기는 영역을 오퍼랜드 필드라고 합니다.

 

 

오퍼랜드

 

'연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 의미합니다.

 

그래서, 숫자와 문자 등을 나타내는 데이터 또는, 메모리나 레지스터 주소가 올 수 있습니다.

 

오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기 보다는, 

많은 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소와 레지스터 이름이 담깁니다.

 

그래서 오퍼랜드 주소를 주소 필드라고부릅니다.

 

 

 

연산 코드

 

명령어가 수행할 연산을 의미합니다. '더해라' ,  '빼라' , '저장해라' 에 해당하는 부분이 연산 코드입니다.

 

종류는 매우 많지만, 크게 네 가지 유형으로 나눌 수 있습니다.

1. 데이터 전송

2. 산술/논리 연산

3. 제어 흐름 변경

4. 입출력 제어

 

명령어의 종류와 생김새는 CPU마다 다르기 때문에 연산 코드의 종류와 생김새 또한 CPU마다 다릅니다.

 

데이터 전송

  • MOVE : 데이터를 옮겨라
  • STORE : 메모리에 저장해라
  • LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
  • PUSH : 스택에 데이터를 저장해라
  • POP : 스택의 최상단 데이터를 가져와라

 

산술/논리 연산

  • ADD / SUBSTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곳셈 / 나눗셈을 수행하라
  • INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라
  • AND / OR / NOT: AND /OR /NOT 연산을 수행해라
  • COMPARE : 두 개의 숫자 또는 TRUE/ FALSE 값을 비교해라

제어 흐름 변경

  • JUMP : 특정 주소로 실행 순서를 옮겨라
  • HALT : 프로그램의 실행을 멈춰라
  • CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
  • RETURN : CALL을 호출할 떄 저장했던 주소로 돌아가라

...etc

 

 

주소 지정 방식

 

앞서 '명령어의 오퍼랜드 필드에 메모리나 레지스터의 주소를 담는 경우가 많다. 그래서 오퍼랜드 필드를 주소 필드라고 부르기도 한다. 근데 의문이 생길 수도 있다.

 

" 왜 오퍼랜드 필드에 메모리나 레지스터의 주소를 담는 것인지? 그냥 <연산 코드, 연산 코드 사용될데이터> 형식으로 명령어로 구성하면 되지 않는 것인지?"

 

이는 명령어 길이 때문입니다.  오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공가만큼 커집니다.

 

오퍼랜드 필드에 메모리 주소가 아닌 레지스터 이름을 명시할 때도 마찬가지입니다. 가짓수는 해당 레지스터가 저장할 수 있는 공간만큼 커집니다. 

 

 

연산의 대상이 되는 데이터가 저장된 위치를 유효 주소 라고 합니다. 첫 번째 그림의 경우, 유효 주소는 10번지, 두 번째 그림의 경우 유효 주소는 레지스터 R1이 됩니다.

 

이렇듯, 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 합니다. 다시 말해, 주소 지정 바식은 유효 주소를 찾는 방법입니다.

 

즉시 주소 지정 방식

연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식입니다. 데이터의 크기가 작아지는 단점이 있지만, 주소 지정 방식들보다 빠르다.

 

직접 주소 지정 방식

오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식입니다. 오퍼랜드 필드에 표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식보다 커졌지만, 여전히 유효 주소를 표현할 수 있는 범위가 줄어들었습니다. 유효 주소에 제한이 생길 수 있습니다.

 

간접 주소 지정 방식

유효 주소의 주소를 어퍼랜드 필드에 명시합니다. 범위가 훨씬  더 넓어집니다. 다만 두 번의 메모리 접근이 필요하기 때문에 앞서 설명하 방식들보다 느린 방식입니다.

 

레지스터 주소 지정 방식

직접 주소 지정 방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법입니다.

 

일반적으로, CPU 외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠릅니다. 그러므로 레지스터 주소 지정 방식은 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있습니다.

 

레지스터 간접 주소 지정 방식

연산에 사용할 데이터를 메모리에 저장하고, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법입니다. 

간접 주소 지정 방식과 비슷하지만 접근횟수가 한 번으로 줄어든다는 차이이자  장점이 있습니다. 메모리에 접근하는 것이 레지스터에 접근하는 것보다 느립니다 . 따라서 레지스터 간접 주소 지정 방식이 더 빠릅니다.

 

정리

연산에 사용할 데이터를 찾는 방법을 주소 지정 방식 이라고 한다.

연산에 사용할 데이터가 저장된 위치를 유효 주소라고 한다.

 

그리고 대표적인 주소 지정 방식으로 아래의 다서 가지 방식을 소개했다.

각각의 방식이 오퍼랜드 필드에 명시하는 값을 정리해보자면,

 

  • 즉시 주소 지정 방식 : 연산에 사용할 데이터
  • 직접 주소 지정 방식 : 유효 주소 (메모리 주소)
  • 간접 주소 지정 방식 : 유효 주소의 주소
  • 레지스터 주소 지정 방식 : 유효 주소 (레지스터 이름)
  • 레지스터 간접 주소 지정 방식 : 유효 주소를 저장할 레지스터

 

스택과 큐

 

스택이란 한쪽 끝이 막혀 있는 통과 같은 저장 공간입니다.

한쪽 끝이 막혀 있어서 막혀있지 않은 쪽으로 데이터를 차곡차곡 저장하고, 저장한 자료를 빼낼 떄는 마지막으로 저장한 데이터부터 빼닙니다. LIFO (Last In First Out)

 

 

스택에 새로운 데이터를 저장하는 명령어가 PUSH, 스택에 저장된 데이터를 꺼내는 명령어가 POP 입니다. 

 

스택과는 달리 양쪽이 뚫려 있는 통고 ㅏ같은 저장 공간을 라고 합니다. 큐는 '가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식이라는 저에서 FIFO 자료 구조라고도 부릅니다.

 

마무리

  • 명령어는 연산 코드와 오퍼랜드로 구성된다.
  • 연산 코드는 명령어가 수행할 연산을 의미한다.
  • 오퍼랜드는 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치를 의미한다..
  • 주소 지정 방식은 연산에 사용할 데이터 위치를 찾는 방법이다.