본문 바로가기
IT

중앙처리장치(CPU)의 구성과 명령어 처리 과정 그리고 명령어 세트

by EDMBLACKBOX 2020. 12. 21.
728x90

과거에 폰 노이만(Von Neumann)은 프로그램과 데이터를 기억장치에 저장시킨 후 명령어 순서대로 처리하는 프로그램 내장방식(Stored Program Method)을 제안했습니다. 이 방식을 기반으로 제작된 컴퓨터 시스템을 폰 노이만형 컴퓨터라고 하며 현대에서 대부분의 컴퓨터가 이 방식을 따르고 있습니다.

중앙처리장치(CPU)의 구성

중앙처리장치는 컴퓨터 시스템에서 가장 핵심적인 역할을 수행하는 부분으로 인간으로 따지면 두뇌와 비슷합니다. 주기억장치로부터 프로그램 명령어와 데이터를 읽어와 처리하고 명령어의 수행 순서를 제어하는 역할을 합니다.

중앙 처리장치는 아래의 그림과 같이 산술논리연산장치, 제어장치, 레지스터로 구성됩니다.

 

산술 논리 연산장치
덧셈, 뺄셈, 곱셈, 나눗셈 등의 산술 연산과 논리곱(AND), 논리합(OR), 논리 부정(NOT) 등 논리 연산을 수행합니다. 두 가지 연산을 모두 수행하기 때문에 산술 논리 연산장치라고 불리며 간단히 연산장치라고도 합니다. 산술 논리 연산장치는 연산에 필요한 데이터를 레지스터에서 가져오고, 연산 결과는 다시 레지스터에 저장합니다.

제어장치
명령어를 순서대로 실행할 수 있도록 제어하는 장치입니다. 제어장치는 주기억장치로부터 프로그램 명령어를 인출하여 해독한 후, 그 결과에 따라 명령어 실행에 필요한 제어 신호를 기억장치, 연산장치, 입출력 장치 등에게 보냅니다. 또한 이들 장치로부터 신호를 받아 다음에 수행할 동작을 결정하는 역할을 합니다.

레지스터
중앙처리장치의 속도와 비슷한 고속의 기억장치로, 중앙처리장치에 존재합니다. 명령어 주소, 연산에 필요한 데이터, 명령어 코드, 연산 결과 등을 임시로 저장하며, 용도에 따라 범용 레지스터와 특수 목적 레지스터로 구분합니다. 중앙처리장치의 종류에 따라 사용할 수 있는 레지스터의 개수와 크기는 각각 다릅니다.

범용 레지스터는 산술 논리 연산에 필요한 데이터나 연산 결과를 임시로 저장합니다. 한편 특수 목적 레지스터는 특별한 용도에만 사용되며 용도와 기능에 따라 나눌 수 있습니다.

특수 목적 레지스터의 종류로는 메모리 주소 레지스터(MAR), 프로그램 카운터(PC), 스택 포인터(SP), 인덱스 레지스터(IX), 명령어 레지스터(IR), 누산기(AC), 메모리 버퍼 레지스터(MBR), 프로그램 상태 레지스터(PSR) 등이 있습니다. 아래의 표는 특수 목적 레지스터의 용도와 기능에 따른 분류입니다.

용도 명칭 기능
주소 저장 메모리 주소 레지스터(MAR : Memory Address Register) 읽기와 쓰기 연산을 수행할 주기억장치의 주소를 저장합니다.
프로그램 카운터(PC : Program Counter) 다음에 수행할 명령어의 주소를 저장합니다.
스택 포인터(SP : Stack Pointer) 스택의 최상위 주소를 저장합니다.
인덱스 레지스터(IX : Index Register) 인덱스 주소지정 방식에서 인덱스를 저장합니다.
명령어 저장 명령어 레지스터(IR : Instruction Register) 현재 실행 중인 명령어를 저장합니다.
데이터 저장 메모리 버퍼 레지스터(MBR : Memory Buffer Register) 주기억장치에서 읽어온 데이터나 주기억장치에 저장할 데이터를 임시로 저장합니다.
누산기(AC : ACcumulator) 연산 결과를 임시로 저장합니다.
CPU 상태 저장 프로그램 상태 레지스터(PSR : Program Status Register) CPU의 현재 상태 정보를 저장합니다.

스택은 자료의 삽입과 삭제가 끝에서만 발생하는 자료 구조입니다. 나중에 들어간 자료가 먼저 나오는 후입 선출(LIFO : Last In First Out) 방식을 사용합니다.

 

명령어 처리 과정

중앙처리장치(CPU)는 프로그램을 실행하기 위해 주기억장치로부터 명령어를 순차적으로 인출하여 해독하고 실행하는 과정을 반복합니다. 중앙처리장치가 주기억장치로부터 한 번에 하나의 명령어를 인출하여 실행하는 데 필요한 일련의 활동을 명령어 사이클(Instruction Cycle)이라고 합니다. 명령어 사이클은 아래의 그림과 같이, 인출 사이클과 실행 사이클로 나눠집니다. 먼저 인출 사이클에서는 주기억장치의 지정된 주소에서 하나의 명령어를 가져오고, 실행 사이클에서는 명령어를 수행합니다. 하나의 명령어 실행이 완료되면 그다음 명령어에 대한 인출 사이클이 시작됩니다.

출처 : uobabylon.edu

명령어 사이클은 아래의 그림과 같이 인출 사이클(Fetch Cycle), 실행 사이클(Execution Cycle), 간접 사이클(Indirect Cycle), 인터럽트 사이클(Interrupt Cycle)의 4개 부 사이클(Subcycle)로 세분화할 수 있습니다. 각각의 부 사이클은 CPU 레지스터를 포함하는 일련의 마이크로 연산(Micro Operation)으로 구성됩니다. 인출 사이클과 실행 사이클은 항상 수행되지만, 간접 사이클과 인터럽트 사이클은 주소 지정 방식과 인터럽트 요구에 따라 필요할 때만 수행됩니다.

출처 : GreeksforGeeks

인출 사이클
주기억장치에서 명령어를 인출하고, 다음 명령어를 인출하기 위해 프로그램 카운터(PC : Program Counter) 값을 증가시킵니다. 인출 사이클의 자세한 동작은 아래의 그림과 같습니다.

출처 : 네이버 재윤님 블로그

1. 프로그램 카운터(PC)에 지정된 주소를 메모리 주소 레지스터(MAR)에 전달합니다.
2. 메모리 주소 레지스터(MAR)에 저장된 내용을 토대로 주기억장치의 해당 주소에서 명령어를 인출합니다.
2. 메모리 버퍼 레지스터(MBR)에 저장합니다.
3. 다음 명령어를 인출하기 위해 프로그램 카운터(PC) 값을 증가시킵니다.
4. 메모리 버퍼 레지스터(MBR)에 저장된 내용이 명령어 레지스터(IR)에 전달됩니다.

실행 사이클
인출한 명령어를 해독하고 그 결과에 따라 제어 신호를 발생시켜 명령어를 실행합니다. 명령어는 연산 코드(Operation Code)와 0개 이상의 주소 필드(Address Field, Operand)로 구성됩니다. 연산 코드는 수행될 연산을 기술하며, 주소 필드는 명령어 수행에 필요한 데이터의 주기억장치 주소를 기술합니다. 인출 사이클, 간접 사이클, 인터럽트 사이클은 단순하기 때문에 동일한 마이크로 연산이 반복되나, 실행 사이클은 명령어의 연산 코드마다 수행되는 마이크로 연산이 달라집니다.

간접 사이클
명령어 주소 필드에는 데이터가 저장된 주기억장치 주소를 기술하는 방식과 데이터의 주소가 저장된 주기억장치 주소를 기술하는 방식이 있습니다. 직접 주소 지정 방식(Direct Addressing Mode)은 아래의 그림과 같이 데이터가 저장된 주기억장치 주소를 기술하며, 간접 주소 지정 방식(Indirect Addressing Mode)은 아래의 두번째 그림과 같이 데이터의 주소가 저장된 주기억장치 주소를 기술합니다. 직접 주소지정 방식을 사용하는 명령어는 실행 사이클을 즉시 수행하지만, 간접 주소지정 방식을 사용하는 명령어는 실행 사이클을 수행하기 전에 실제 데이터가 저장된 주기억장치의 주소인 유효 주소(Effective Address)를 한번 더 읽어 옵니다.

직접 주소지정 방식, 출처 : 네이버 푸른하늘의 해 님 블로그
간접 주소지정 방식, 출처 : 네이버 푸른하늘의 해 님 블로그

 

인터럽트 사이클

인터럽트(Interrupt)란 중앙처리장치가 프로그램을 수행하는 동안 컴퓨터 시스템의 내부와 외부에서 발생하는 예기치 못한 사건을 말합니다. 컴퓨터 시스템은 인터럽트에 대하여 적절한 조치를 취해 프로그램이 계속 수행될 수 있도록 합니다.

중앙처리장치는 실행 사이클이 완료된 후 인터럽트 요구가 있는지 검사합니다. 인터럽트 요구가 없으면 다음 명령어를 인출하고, 인터럽트 요구가 있으면 현재 수행 중인 프로그램의 주소 값인 PC 값을 특정 영역(스택이나 주기억장치의 0번지)에 저장한 후 PC에는 다시 인터럽트 처리 루틴의 시작 주소를 저장합니다. 이에 따라 인터럽트 처리가 완료되면 중단된 프로그램으로 복귀하여 수행을 계속합니다. 아래의 그림은 인터럽트 사이클이 포함된 명령어 사이클의 동작 과정입니다.

인터럽트 사이클이 포함된 명렁어 사이클, 출처 : 하룻고양이 님 티스토리

 

명령어 세트
명령어는 중앙처리장치가 실행할 연산과 명령어 처리에 필요한 데이터의 저장 위치를 나타내는 주소로 구성됩니다. 명령어 세트(Instruction Set)란 명령어의 집합으로 중앙처리장치에 따라 형식과 종류가 다릅니다.

명령어 형식
명령어는 아래의 표와 같이 실행할 연산을 나타내는 연산 코드(Operation Code)와 연산에 필요한 데이터나 데이터의 저장 위치를 나타내는 주소 필드(Operand)로 구성됩니다.

연산 코드(Operation Code) 주소 필드(Operand)

↑명령어의 기본 형식

연산 코드는 길이가 n비트일 때 최대 2n개의 연산을 정의할 수 있습니다. 연산 코드 길이가 4비트라면 최대 16(=24) 가지의 연산을 정의할 수 있습니다.
연산 코드는 실행하는 연산의 종류에 따라 다음의 4가지 기능으로 분류할 수 있습니다.

연산 기능 : 사칙연산, 시프트, 보수 등의 산술 연산과 논리곱(AND), 논리합(OR), 논리 부정(NOT) 등의 논리 연산을 수행합니다.
데이터 전달 기능 : 레지스터와 레지스터 사이, 레지스터와 주기억장치 사이에 데이터를 전달합니다.
제어 기능 : 조건 분기와 무조건 분기 등을 이용하여 명령어의 실행 순서를 제어합니다.
입출력 기능 : 프로그램과 데이터를 주기억장치에 전달하고, 연산 결과는 출력 장치로 전달합니다.

주소 필드는 기억장치의 주소, 숫자나 문자, 논리 데이터 등을 저장할 수 있습니다. 숫자는 정수나 고정 소수점 수, 부동 소수점 수, BCD(Binary Coded Decimal) 등으로 저장되고, 문자는 ASCII 코드로 저장됩니다. 논리 데이터는 참 또는 거짓을 표현할 때 사용하며 비트나 플래그(Flag) 등으로 저장됩니다.

주소 필드 수에 따른 명령어 분류
명령어의 주소 필드 수는 중앙처리장치 구조에 따라 달라집니다. 명령어를 주소 필드 수에 따라 분류하면 아래의 표와 같이 0-주소 명령어, 1-주소 명령어, 2-주소 명령어, 3-주소 명령어로 나눌 수 있습니다.
순서대로 0, 1, 2, 3 주소 명령어입니다.

연산 코드
연산 코드 주소 1
연산 코드 주소 1 주소 2
연산 코드 주소 1 주소 2 주소 3

0-주소 명령어
0-주소 명령어는 연산 코드만 존재하며 스택 구조 컴퓨터에서 사용됩니다. 아래의 그림과 같이 스택의 TOP에 데이터를 삽입하는 연산은 PUSH 연산, TOP에서 데이터를 삭제하는 연산은 POP 연산입니다.

스택의 PUSH 연산, 출처 : tutorials point
스택의 POP 연산, 출처 : tutorials point

스택을 이용한 연산은 TOP에서 두 개의 데이터를 꺼내어(POP) 연산한 후 그 결과를 다시 추가(PUSH)하는 것입니다. 연산에 필요한 두 개의 데이터가 스택의 TOP에 존재하므로 명령어 주소 필드가 필요 없습니다.

1-주소 명령어
1-주소 명령어는 레지스터 값이 매우 비싸던 초기의 단일 누산기 구조 컴퓨터에서 사용되었습니다. 누산기 구조 컴퓨터는 누산기(AC) 레지스터를 이용하여 데이터 연산을 수행하는데, 연산에는 주기억장치에서 읽힌 데이터와 누산기에 저장된 데이터가 사용되고, 연산 결과는 다시 누산기에 저장됩니다.

2-주소 명령어
2-주소 명령어는 대부분의 컴퓨터가 채택하고 있는 가장 일반적인 형태입니다. 주소 필드에는 레지스터 번호나 주기억장치의 주소를 지정할 수 있습니다.

3-주소 명령어
3-주소 명령어는 3개의 주소 필드를 가지며, 주소 필드에 레지스터 번호나 주기억장치의 주소를 지정할 수 있습니다. 프로그램의 길이가 짧아지는 장점이 있지만 명령어 하나의 길이가 길어지는 단점도 있습니다.

728x90