명령어의 구조

최건우·2023년 1월 18일
0

연산 코드와 오퍼랜드

  • 명령어: 연산 코드 + 오퍼랜드
    • 연산 코드(operation code): 명령어가 수행할 연산(=연산자)
    • 오퍼랜드(operand): 연산에 사용할 데이터 또는 그것이 저장된 위치(=피연산자)
  • 연산 코드 필드: 명령어에서 연산 코드가 담기는 영역
  • 오퍼랜드 필드: 명령어에서 오퍼랜드가 담기는 영역

오퍼랜드

  • 오퍼랜드 필드에는 연산에 사용할 데이터 또는 그것이 저장된 메모리나 레지스터 주소가 오며, 특히 데이터가 직접 명시되는 경우는 상대적으로 적다. 따라서 '주소 필드' 라고 부르기도 한다.
  • 오퍼랜드 개수에 따른 명령어 명칭
    • 0-주소 명령어: 오퍼랜드가 하나도 없는 명령어
    • 1-주소 명령어: 오퍼랜드가 하나인 명령어
    • 2-주소 명령어: 오퍼랜드가 두 개인 명령어
    • 3-주소 명령어: 오퍼랜드가 세 개인 명령어

연산 코드

  • CPU에 따라 명령어의 종류와 생김새가 다르므로 연산 코드 역시 다르지만, 공통적인 유형은 다음과 같다.
    • (1) 데이터 전송
      • MOVE: 데이터를 옮겨라
      • STORE: 메모리에 저장하라
      • LOAD(FETCH): 메모리에서 CPU로 데이터를 가져와라
      • PUSH: 스택에 데이터를 저장하라
      • POP: 스택의 최상단 데이터를 가져와라
    • (2) 산술/논리 연산
      • ADD / SUBTRACT / MULTIPLY / DIVIDE: 사칙연산(덧셈 / 뺄셈 / 곱셈 / 나눗셈)을 수행하라
      • INCREMENT / DECREMENT: 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라
      • AND / OR / NOT: AND / OR / NOT 연산을 수행하라
      • COMPARE: 두개의 숫자 또는 TRUE / FALSE 값을 비교하라
    • (3) 제어 흐름 변경
      • JUMP: 특정 주소로 실행 순서를 옮겨라
      • CONDITIONAL JUMP: 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
      • HALT: 프로그램의 실행을 멈춰라
      • CALL: 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
      • RETURN: CALL을 호출할 때 저장했던 주소로 돌아가라
    • (4) 입출력 제어
      • READ(INPUT): 특정 입출력 장치로부터 데이터를 읽어라
      • WRITE(OUTPUT): 특정 입출력 장치로 데이터를 써라
      • START IO: 입출력 장치를 시작하라
      • TEST IO: 입출력 장치의 상태를 확인하라
<스택과 >

- 스택(stack):
  - 한쪽 끝이 막혀 있는 저장 공간. 막혀있지 않은 공간으로 데이터를 저장하고, 빼낸다. 나중에 들어온 데이터일수록 공간의 최상단에 쌓인다.
  - LIFO(Last In First Out): 후입선출. 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식.
  - PUSH: 데이터 저장 명령어
  - POP: 데이터 꺼내기 명령어
- 큐(queue):
  - 양쪽이 뚫려 있는 저장 공간. 한 쪽으로 데이터를 저장하고, 반대편에서 빼낸다. 입구를 통해 들어간 데이터는 순서대로 출구 앞에 차곡차곡 쌓인다.
  - FIFO(First In First Out): 선입선출. 가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식.

주소 지정 방식

주소 지정 방식(address mode): 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법.

  • 명령어의 오퍼랜드 필드에 데이터를 직접 담지 않고 메모리나 레지스터의 주소를 담는 이유는 명령어의 길이 때문이다.
  • 명령어는 연산 코드의 크기, 오퍼랜드 개수에 따라 하나의 오퍼랜드 필드로 표현할 수 있는 정보의 가짓수가 달라진다. 즉, 오퍼랜드 개수가 많은 명령일수록 하나의 오퍼랜드 필드에서 표현 가능한 정보의 가짓수가 적어진다.
  • 하지만 메모리 주소나 레지스터 이름이 담긴다면, 하나의 오퍼랜드 필드가 표현할 수 있는 데이터의 크기는 바로 '하나의 메모리 주소에 저장할수 있는 공간'만큼 커진다. 따라서 오퍼랜드 필드에 데이터를 직접 담는 것보다 주소를 담는 것이 훨씬 경제적이다.
  • 이때 연산 코드에 사용할 데이터가 저장된 위치, 연산의 대상이 되는 데이터가 저장된 위치를 유효 주소(effective address) 라고 한다.

즉시 주소 지정 방식

  • 즉시 주소 지정 방식(Immediate addressing mode)
    • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
    • 단점: 표현할 수 데이터의 크기가 작아짐
    • 장점: 주소를 찾아가는 과정이 없으므로 다른 주소 지정 방식들보다 빠름

직접 주소 지정 방식

  • 직접 주소 지정 방식(Direct addressing mode)
    • 오퍼랜드 필드에 유효 주소(메모리 주소)를 직접 명시하는 방식
    • 단점: 유효 주소를 표현할 수 있는 범위가 여전히 연산 코드의 비트 수만큼 줄어들어 있으므로, 유효 주소에 제한이 생길 수 있음.
    • 장점: 즉시 주소 지정 방식에 비해 큰 크기의 데이터를 오퍼랜드 필드에서 표현할 수 있음.

간접 주소 지정 방식

  • 간접 주소 지정 방식(Indirect addressing mode)
    • 오퍼랜드 필드에 "유효 주소의 주소"를 명시하는 방식. 예를 들어 메모리에 연산에 사용할 데이터 A와 A의 유효 주소인 B가 함께 저장되어 있다면, 오퍼랜드 필드에 B의 주소를 명시한다.
    • 단점: 두 번의 메모리 접근이 필요하므로, 느림.
    • 장점: 표현할 수 있는 유효 주소의 범위가 보다 넓어짐.

레지스터 주소 지정 방식

  • 레지스터 주소 지정 방식(Register addressing mode)
    • 연산에 사용할 데이터를 저장한 레지스터 이름을 유효 주소로서 오퍼랜드 필드에 직접 명시하는 방법(직접 주소 지정 방식과 유사)
    • 단점: 표현할 수 있는 레지스터 크기에 제한이 생길 수 있음.
    • 장점: CPU 내부에 있는 레지스터에 접근하는 것이므로, CPU 외부에 있는 메모리에 접근하는 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있음(가장 빠름).

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

  • 레지스터 주소 지정 방식(Register indirect addressing mode)
    • 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법(간접 주소 지정 방식과 유사)
    • 단점: CPU 외부의 메모리에 접근해야 하므로, 레지스터 주소 지정 방식에 비해 느림.
    • 장점: 메모리에 접근하는 횟수가 한 번이므로, 간접 주소 지정 방식에 비해 조금 더 빠름.

*이 글은 '혼자 공부하는 컴퓨터 구조+운영체제(한빛미디어, 2022)'를 개인적인 학습을 목적으로 요약한 게시글입니다. 문제가 있는 경우, 지적해 주시면 감사하겠습니다.

profile
부족한 경험을 채우기 위한 나만의 기록 공간

0개의 댓글