[컴퓨터 구조/운영체제] 명령어의 구조

myungji·2024년 4월 20일

이 글은 한빛미디어 출판사의 '혼자 공부하는 컴퓨터 구조+운영체제(강민철 저)'를 정리한 내용입니다.

1. 연산 코드와 오퍼랜드

명령어: 연산 코드 + 오퍼랜드
연산코드(= 연산자): 명령어가 수행할 연산
오퍼랜드(= 피연산자): 연산에 사용할 데이터, 연산에 사용할 데이터가 저장된 위치

연산 코드 필드: 연산 코드가 담기는 영역
오퍼랜드 필드: 오퍼랜드가 담기는 영역

1-1. 오퍼랜드

오퍼랜드는 '연산에 사용할 데이터' 혹은 '연산에 사용할 데이터가 저장된 위치'를 의미한다. 하지만 오퍼랜드 필드에는 대부분의 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담긴다. 그래서 오퍼랜드 필드를 '주소 필드'라고 부르기도 한다.

오퍼랜드는 명령어에 아예 안 담길 수도 있고, 1개만 있을 수도 있고 2개, 3개가 있을 수도 있다.
이 때 오퍼랜드가 하나도 없는 명령어는 0-주소 명령어, 1개인 명령어는 1-주소 명령어, 2개인 명령어는 2-주소 명령어, 3개인 명령어는 3-주소 명령어라고 한다.
명령어의 크기는 무한대가 아니라 정해져 있기 때문에 1-주소 명령어는 오퍼랜드 필드에 가장 많은 공간을 할당할 수 있고, 3-주소 명령어는 오퍼랜드 필드에 할당할 수 있는 공간이 더 작다.

1-2. 연산 코드

기본적인 연산 코드의 유형은 크게 4가지로 분류가 가능하다.
1. 데이터 전송
2. 산술/논리 연산
3. 제어 흐름 변경
4. 입출력 제어

명령어의 종류와 생김새는 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. 주소 지정 방식

오퍼랜드 필드에 위치 주소가 아닌 데이터가 담기고, 명령어의 크기가 16비트이고 연산 코드 필드가 4비트인 2-주소 명령어가 있다고 해보자. 연산 코드 4비트를 빼고나면 12비트가 남기 때문에 오퍼랜드 필드 하나당 6비트가 할당이 된다. 즉, 하나의 오퍼랜드 필드에서 표현할 수 있는 정보의 가짓수는 2의 6제곱 개이다.

그러나 오퍼랜드 필드에 주소가 담긴다면, 표현할 수 있는 정보의 크기는 하나의 메모리 주소 공간만큼 커진다.
예를 들어, 한 주소에 16비트를 저장할 수 있는 메모리가 있다고 해보자. 이 메모리에 데이터를 저장하고 오퍼랜드 필드 안에 이 메모리 주소를 명시한다면 표현할 수 있는 데이터의 가짓수는 2의 16제곱 개이다.

이 때 연산의 대상이 되는 데이터가 저장된 위치를 '유효 주소'라고 한다.

위와 같이 오퍼랜드 필드에 데이터가 담긴 위치를 명시할 때, 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 한다. 다르게 말하면 주소 지정 방식은 유효 주소를 찾는 방법이다.

2-1. 즉시 주소 지정 방식

연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식.

  • 장점: 데이터를 찾을 필요가 없음
  • 단점: 표현할 수 있는 데이터의 크기가 작음

2-2. 직접 주소 지정 방식

오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식

  • 장점: 즉지 주소 지정 방식보다 표현할 수 있는 데이터의 크기가 크다
  • 한계: 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아진다

2-3. 간접 주소 지정 방식

유효 주소의 주소를 오퍼랜드 필드에 명시

  • 장점: 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 더 넓음(유효 주소를 다른 메모리에 저장하고, 이 메모리의 주소를 오퍼랜드 필드에 명시하는 것이기 때문에 유효 주소의 길이가 연산 코드의 길이에 영향을 받지 않음)
  • 단점: 2번의 메모리 접근이 필요해서 속도가 느림

2-4. 레지스터 주소 지정 방식

연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시

  • 장점: CPU 밖에 있는 메모리보다 CPU 내에 있는 레지스터에 접근하는 게 빠르기 때문에 속도가 더 빠름
  • 단점: 레지스터 주소가 담긴 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아짐

2-5. 레지스터 간접 주소 지정 방식

연산에 사용할 데이터를 메모리에 저장하고, 이 메모리의 주소(유효 주소)를 레지스터에 저장한 다음 오퍼랜드 필드에 이 레지스터 주소를 명시하는 방법

  • 장점: 레지스터 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 더 넓다
  • 단점: 메모리에 1번 접근해야 하기 때문에 레지스터 주소 지정 방식보다는 속도가 느리지만, 간접 주소 지정 방식보다는 빠르다

정리. 주소 지정 방식

  • 주소 지정 방식: 연산에 사용할 데이터를 찾는 방법
  • 유효 주소: 연산에 사용할 데이터가 저장된 위치

대표적인 주소 지정 방식 5가지
1. 즉시 주소 지정 방식: 데이터 직접 명시
2. 직접 주소 지정 방식: 데이터가 담긴 메모리 주소(유효 주소) 명시
3. 간접 주소 지정 방식: 유효 주소의 주소 명시
4. 레지스터 주소 지정 방식: 데이터가 담긴 레지스터 주소(유효 주소)를 명시
5. 레지스터 간접 주소 지정 방식: 유효 주소가 담긴 레지스터 주소 명시


번외. 스택과 큐

스택: 한쪽 끝이 막혀 있는 통과 같은 저장 공간.

  • 데이터를 차곡차곡 저장하고, 마지막으로 저장한 데이터부터 빼낼 수 있음
  • Last In, First Out(LIFO, 후입선출)
  • PUSH: 스택에 새로운 데이터 저장하는 명령어
  • POP: 스택에 마지막으로 담긴 데이터 꺼내는 명령어

큐: 양쪽이 뚫려있는 통과 같은 저장 공간

  • 한쪽으로 데이터 저장, 한쪽으로 데이터 빼냄
  • First In, First Out(FIFO, 선입선출)

출처 - '혼자 공부하는 컴퓨터 구조+운영체제(한빛미디어, 강민철 저)'

profile
iOS 초보바리

0개의 댓글