CS/컴퓨터 구조

명령어의 구조

jungmin.park 2024. 1. 17. 21:03

누군가에게 명령할 때 어떻게 우리는 말할까요?

"학생들, 다음주까지 과제를 제출해주세요"

"멍멍아, 이거 물어와!" 와 같이 말합니다.

 

연산 코드와 오퍼랜드

 

"멍멍아, 이거 물어와" 명령을 내릴때 다음과 같은 구조를 가지고 있습니다.

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

 

컴퓨터 속 명령어도 이와 같습니다.

더해라(작동) 100과 120을

 

빼라(작동) 메모리 32번지 안의 값과 메모리 33번지 안의 값

빨간색 글씨는 명령의 '작동' -> '연산' 을 담고 있으며

나머지 필드는 '연산에 사용할 데이터' or '연산에 사용할 데이터가 저장된 위치' 를 담고 있습니다.

 

명령어 = 연선코드 + 오퍼랜드

연사코드(operation code ) : '더해라', '빼라' 와 같은 명령어가 수행할 연산

오퍼랜드(operand) : '100과' '120을' / '메모리 32번지 안의 값과' '메모리 33번지 안의 값' -> '연산에 사용할 데이터' / '연산에 사용할 데이터가 저장된 위치' 

연산코드 = 연산자, 오퍼랜드 = 피연산자 

 


오퍼랜드(operand)

다시 짚고 넘어가겠습니다. 오퍼랜드는 '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 의미합니다.

오퍼랜드 필드에는 무엇이 들어갈 수 있을까요?

  • 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있습니다.
  • 오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기 보다
    • 연산에 사용할 데이터가 저장된 위치 -> 메모리 주소 or 레지스터 이름이 담깁니다. 오퍼랜드 필드를 주소필드라고 부르기도 합니다.
  • 오퍼랜드 필드에는 명렁어가 없을 수 있고, 하나만 있을 수 있고, 두 개 또는 여러개가 있을 수 있습니다.
    • 0-주소 명령어: 오퍼랜드가 하나도 없는 명령어
    • 1-주소 명령어: 오퍼랜드가 하나인 명령어
    • 2-주소 명령어: 오퍼랜드가 두 개인 명령어로 가장 많이 사용하는 형식입니다.
      • 범용 레지스터 구조의 컴퓨터에 사용
      • 각 주소부는 레지스터나 주기억 장치의 주소를 지정합니다.
      • 연산 후 입력 자료의 보존이 필요 없으면 연산 결과를 두 개의 입력 자료가 기억되어 있던 곳들 중 한 레지스터에 기억시키는 방식입니다.
    • 3-주소 명령어: 오퍼랜드가 세 개인 명령어

 

 


연산 코드

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

연산코드는 네 가지로 나눌 수 있습니다.

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

데이터 전송

  • 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 : 특정 주소로 실행 순서를 옮겨라 ( ex. JUMP 120 : 120으로 특정 메모리 주소로 건너뛰어 실행 )
  • CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
  • HALT : 프로그램의 실행을 멈춰라
  • CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
  • RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라

* CALL과 RETURN은 함수를 호출하고 리턴하는 명령어입니다.

 

입출력 제어

  • READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
  • WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라
  • START IO : 입출력 장치를 시작하라
  • TEST IO : 입출력 장치의 상태를 확인하라

주소 지정 방식

앞선 글에서 오퍼랜드에는 메모리나 레지스터의 주소를 담는 경우가 더 많다고 했습니다. 그래서 오퍼랜드 필드를 주소 필드라고 부릅니다.

왜 바로 담으면 되는데 주소를 담는걸까요?

 

이는 명령어의 길이 때문입니다. 

하나의 명령어가 n비트로 구성되어 있고, 그 중 연산 코드 필드가 m비트라고 가정한다.

이때 오퍼랜드 필드에 가장 많은 공간을 할당할 수 있는 1-주소 명령어라 할지라도 오퍼랜드 필드의 길이는 연산 코드만큼의 길이를 뺀 n-m비트가 됩니다.

2-주소 명령어, 3-주소 명령어라면 오퍼랜드 필드의 크키가 더욱 작아지는 것이다.

 

명렁어의 크키가 16비트, 연산 코드 필드가 4비트인 2-주소 명령어에서는 오퍼랜드 필드당 6비트 정도밖에 남지 않게 되는 것이다.

즉, 하나의 오프랜드 필드로 표현할 수 있는 정보의 가짓수는 2^6개 밖에 되지 않습니다.

 

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

예를 들어 한 주소에 16비트를 저장할 수 있는 메모리가 있다고 가정해봅시다.

이 메모리 안에 데이터를 저장하고, 오퍼랜드 필드 안에 해당 메모리 주소를 명시한다면 표현할 수 있는 정보의 가짓수는 2^16으로 커지게 됩니다.

레지스터 이름을 명시할때도 마찬가지입니다. 이 경우 표현할 수 있는 정보의 가짓수는 해당 레지스터가 저장할 수 있는 공간만큼 커집니다.

 

연산에 사용할 데이터가 저장된 위치, 즉 연산의 대상이 되는 데이터가 저장된 위치를 유효주소(effective address)라고 합니다. 첫 번째 그림의 경우 유효 주소는 200번지, 두 번째 그림의 유효 주소는 레지스터 R이 되는 것입니다.

 

이렇듯 오퍼랜드 필드가 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식(addressing mode)이라고 합니다.

주소 지정 방식은 유효 주소를 찾는 방법입니다.

주소지정방식에 대표적으로 다섯가지가 있습니다.

 

1. 즉시 주소 지정 방식(immediate addressing mode)

  • 가장 간단한 형태의 주소 지정 방식
  • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식입니다.
  • 단점 : 데이터의 크기가 작아집니다.
  • 장점 : 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문에 이하 설명할 주소 지정 방식들보다 빠릅니다.

2. 직접 주소 방식(direct addressing mode)

  • 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
  • 즉시 주소 지정 방식보다 데이터 크기는 커졌지만
  • 유효 주소를 표현할 수 있는 범위가 연산 코드의 비트 수만큼 줄어들었습니다.
    • 표현할 수 있는 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소에 제한이 생길 수 있습니다.

3. 간접 주소 지정 방식(indirect addressing mode)

  • 유효 주소를 오퍼랜드 필드에 명시
  • 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 넓어집니다.
  • 두 번의 메모리 접근이 필요하기 때문에 앞서 설명한 주소 지정 방식들보다 일반적으로 느린 방식입니다.
  • 때때로 연산에 사용할 데이터가 레지스터에 저장된 경우도 있습니다. 이 경우 레지스터 주소 지정 방식 or 레지스터 간접 주소 지정 방식을 사용할 수 있습니다.

4. 레지스터 주소 지정 방식(register addressing mode)

  • 직접 주소 지정 방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법입니다.
  • 일반적으로 CPU 외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 빠릅니다.
  • 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있습니다.
  • 다만, 레지스터 주소 지정 방식은 직접 주소 지정 방식과 비슷한 문제를 공유합니다.
  • 표현할 수 있는 레지스터 크기에 제한이 생길 수 있습니다.

5. 레지스터 간접 주소 지정 방식(register indirect addressing mode)

  • 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법입니다.
  • 유효 주소를 찾는 과정이 간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한 번으로 줄어든다는 차이이자 장점이 있습니다.
  • 메모리에 접근하는 것이 레지스터에 접근하는 것보다 더 느립니다. 따라서 레지스터 간접 주소 지정 방식은 간접 주소 지정 방식보다 빠릅니다.

정리

주소 지정 방식 : 연산에 필요한 데이터를 찾는 방법

유효 주소 : 연산에 사용할 데이터가 저장된 위치

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