이전 포스팅 컴퓨터의 기본 구조에서 CPU가 어떻게 구성되어있는지 먼저 보고오자!
▶ 명령어의 형식
CPU는 명령어를 받아 처리한다.
그렇다면, 명령어는 어느 형식으로 이루어져 있을까?
▷ 구성
- 명령어는 오퍼레이션(연산 코드)과 오퍼랜드(피연산자)로 구성되어 있다.
- 오퍼레이션(Operation code)
- 연산자를 담당
- 동사에 해당(더해라, 곱해라, 나눠라, 저장해라)
- 오퍼랜드(operand)
- 피연산자를 담당
- 목적어에 해당 (
더해라 무엇을)
- '연산에 사용할 데이터'(숫자나 문자) 또는 '연산에 사용할 데이터가 저장된 위치'(메모리 주소나 레지스터 이름) 이다.
- 오퍼랜드 필드는 '연산에 사용할 데이터가 저장된 위치' 가 훨씬 많이 쓰이므로 주소 필드라고 하기도 한다.
- 오퍼랜드는 명령어 안에 하나도 없을 수도 있고, 한 개만 있을 수도 있고, 한 개 이상일 수도 있다.
▷ 주소에 따른 명령어 방식
- 명령어 형식은 오퍼랜드 수에 따라 3, 2, 1, 0 주소 방식으로 구분한다.
- 오퍼랜드가 하나도 없는 명령어를 0-주소 명령어, 오퍼랜드가 하나인 명령어를 1-주소 명령어, 두 개인 명령어를 2-주소 명령어, 세 개인 명령어를 3-주소 명령어라고 부른다.
① 0-주소 명령어
- 정의
- 연산코드부(오퍼레이션)만 존재하고 주소를 지정하는 오퍼랜드가 존재하지 않는 명령어
- 특징
- 스택과 관련된 자료를 처리할 때 사용하며, Stack 메모리의 TOP(Stack 포인터)이 가리키는 Operand를 이용하여 명령을 수행한다.
- 스택을 사용하여 모든 연산을 수행하기 때문에 수행 후에는 원래의 자료가 모두 지워진다!
- 피연산자들을 먼저 PUSH 해주고, 연산자를 만나면 피연산자를 POP한 후에 연산 결과를 PUSH한다.
- Postfix 방식으로 수식을 표현한다.
- 다른 주소 명령어들과 달리 STOR 명령어를 사용하지 않는다. (PUSH/POP 사용)
② 1-주소 명령어
- 정의
- 특징
- 누산기(AC)를 이용하여 처리하며 연산 결과도 AC에 저장한다.
- 1주소 명령어는 피연산자 하나로 연산을 수행하는 것이 가능하다!
- AC를 1개만 갖고 있는 컴퓨터에서는 데이터가 AC에 있음을 나타낼 필요가 없고, 연산 결과를 항상 AC에 기억하도록 하면 연산의 주소를 지정할 필요가 없어 하나의 입력 자료의 주소를 생략할 수 있는 것이다.
- 따라서 1-주소 명령어를 쓰는 시스템에서 연산의 중심이 되는 레지스터가 되는 것이다!
- 예시
- 메모리 X번지의 내용과 AC의 내용을 더하고, 그 결과를 다시 AC에 저장해라
- X번지의 데이터를 누산기에 저장해라
③ 2-주소 명령어
- 정의
- 특징
- 가장 일반적인 명령어 방식
- 연산코드, R1, R2가 될 수도 있고, 연산코드 R1, X(기억장치 주소)가 될 수도 있다.
- 장점
- 실행 속도가 빠르고 기억 장소 효율이 좋다.
- 수행 결과를 기억장치에 저장하고 중앙처리장치에도 남아 있어서 결과를 테스트할 때 시간을 절약할 수 있다.
- 단점
- 전체 프로그램 길이가 길어진다.
- 연산 결과를 한쪽에 저장해야 해서 input 받은 값 중에 한쪽의 자료가 사라진다.
- 예시
- R1과 R2를 더하고 그 값을 R1에 저장해라
- R2에 있는 값을 R1으로 이동시켜라
- 메모리 X번지에 있는 값을 가져와 R1이랑 더한다음 그 값을 R1에 저장해라
- Y번지의 기억장치 데이터를 X번지의 기억장치로 이동시켜라 (X, Y는 주소를 나타냄)
④ 3-주소 명령어
- 정의
- 장점
- 수식 계산의 연산 후에도 입력 자료가 사라지지 않는다.
- 두 개의 피 연산자의 연산을 수행하고, 연산 결과 값을 나머지 한 개의 오퍼랜드에 저장할 수 있기 때문
- 프로그램 길이를 짧게 할 수 있다.
- 명령 인출을 위하여 주기억장치를 접근하는 횟수가 줄어든다.
- 한 개의 명령어로 여러 명령을 수행하므로 전체 명령어를 읽어오는 시간은 단축된다.
- 단점
- 명령어 한 개의 길이가 너무 길어진다.
- 하나의 명령을 수행하기 위해서 최소한 4번 기억장소에 접근해야 하므로 수행시간이 길어진다.
- 예시
- Y와 Z번지의 데이터를 더하여 X번지에 저장해라 (X,Y,Z는 각각 주소를 나타냄)
▷ 학습 활동
4가지 주소 형식으로 다음과 같은 연산 프로그램을 구현해 보자 (❁´◡`❁)
- 명령어 리스트
- 학습 활동1
- 수식을 준 다음 1-주소 명령어로 써봐라, 2-주소 명령어로 써봐라, 3-주소 명령어로 써봐라 하는 문제 나올 가능성 존재
- 주소 형식 간의 세부적인 것을 주고 뜻을 써 보라는 문제 나올 가능성 존재
- 어떤 명령을 수행하는 건지 써 보라는 문제 나올 가능성 존재
- 학습활동 2 ( 출처 : https://jeongminhee99.tistory.com/56 )
📎참조