[CS] 명령어의 구조

정은아·2023년 12월 11일
post-thumbnail

명령어의 구조와 주소 지정 방식에 대해 알아보자!
명령어의 생김새와 작동 원리를 이해하자!

연산 코드와 오퍼랜드

  • 명령어는 연산 코드오퍼랜드로 구성되어 있다.
  • '명령어가 수행할 연산'을 연산코드라 하고, '연산에 사용할 데이터가 저장된 위치'를 오퍼랜드 라고한다.
  • 연산코드는 연산자, 오퍼랜드는 피연산자라고 부른다.
  • 연산 코드가 담기는 영역을 연산 코드 필드라고 부르고, 오퍼랜드가 담기는 영역을 오퍼랜드 필드라고 부른다.

오퍼랜드

  • 오퍼랜드는 '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 의미한다.
  • 오퍼랜드 필드에는 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있다.
  • 오퍼랜드 필드를 주소 필드라고 부른다.
  • 오퍼랜드 명령어 안에 하나도 없을수도, 여러개가 있을 수도 있다.
  • 오퍼랜드가 하나도 없는 명령어를 0-주소 명령어라고 하고, 하나인 명령어를 1-주소 명령어, 두 개인 명령어를 2-주소 명령어, 세 개인 명령어를 3-주소 명령어라고 한다.
  • 오퍼랜드 필드에는 연산에 사용할 데이터를 직접 명시하기 보다는 많은 경우 데이터가 저장된 위치를 명시한다.

연산코드

  • 연산코드의 유형은 크게 네 가지로 나뉜다.
    1. 데이터 전송
    2. 산술/논리 연산
    3. 제어 흐름 변경
    4. 입출력 제어

    • 데이터 전송
      • 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 : 입출력 장치의 상태를 확인하라

주소 지정

연산에 사용할 데이터를 찾는 방법을 주소 지정 방식이라고 하고, 연산에 사용할 데이터가 저장된 위치를 유효 주소라고 한다.

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

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

  • 직접 주소 지정 방식
    • 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
    • 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소 제한이 생길 수 있다.

  • 간접 주소 지정 방식
    • 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식
    • 두 번의 메모리 접그닝 필요하기 때문에 다른 주소 지정 방식들보다 일반적으로 느린 방식이다.

  • 레지스터 주소 지정 방식
    • 직접 주소 지정 방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법이다.
    • 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있다.
    • 직접 주소 지정 방식과 비슷한 문제를 공유하므로 표현할 수 있는 레지스터 크기에 제한이 생길 수 있다.

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

스택과 큐

  • 스택
    • 스택이란, 한쪽 끝이 막혀 있는 통과 같은 저장공간이다.
    • 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식(후입선출)이다.
    • LIFO구조다.(Last In First Out)
    • 새로운 데이터를 저장하는 명령어를 PUSH라고 한다.
    • 저장된 데이터를 꺼내는 명령어를 POP이라고 한다.

    • 스택과 달리, 양쪽으로 뚫려있는 저장공간을 큐라고 한다.
    • 가장 먼저 저장된 데이터를 빼내는 데이터 관리 방식(선입선출)이다.
    • FIFO구조다.(First In First Out)
profile
꾸준함의 가치를 믿는 개발자

0개의 댓글