ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인다. 레지스터와 제어장치로부터 받아들인 피연산자와 제어 신호로 연산을 수행한다.
연산의 결과(숫자, 문자, 메모리 주소 등)는 메모리에 바로 저장하지 않고 레지스터에 일시적으로 저장한다. CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느리다. 연산때마다 결과를 메모리에 저장한다면 메모리에 자주 접근하므로 프로그램 실행 속도를 늦출 수 있으므로 메모리가 아닌 레지스터에 우선 저장한다.
ALU는 계산 결과와 더불어 플래그를 내보낸다. 플래그는 연산 결과에 대한 추가적인 상태 정보이다.
종류 | 의미 | 사용 예시 |
---|---|---|
부호 플래그 | 연산한 결과의 부호 | 부호 플래그가 1일 경우 음수, 0일 경우 양수 |
제로 플래그 | 연산 결과가 0인지의 여부 | 제로 플래그가 1일 경우 연산 결과는 0, 0일 경우 0이 아님을 의미 |
캐리 플래그 | 올림수나 빌림수가 발생했는지 | 캐리 플래그가 1일 경우 올림수나 빌림수가 발생했음을 의미, 0일 경우 발생하지 않음 |
오버플로우 플래그 | 오버플로우가 발생했는지 | 1일 경우 오버플로우 발생, 0일 경우 발생하지 않음 |
인터럽트 플래그 | 인터럽트가 가능한지 | 1일 경우 가능, 0일 경우 불가능 |
슈퍼바이저 플래그 | 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지 | 1일 경우 커널 모드. 0일 경우 사용자 모드 |
이러한 플래그들은 플래그 레지스터에 저장된다.
제어 신호를 내보내고 명령어를 해석하는 부품
제어 장치가 받아들이는 정보
✍ 클럭이란 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위이며, 클럭의 주기에 맞춰 작업을 수행한다.
제어 장치가 내보내는 정보
CPU 외부에 전달하는 제어 신호
CPU 내부에 전달하는 제어 신호
CPU 제조사들마다 이름, 크기, 종류가 다양하다. 그 중에서 공통으로 포함하고 있는 레지스터들이 있다.
프로그램 카운터(PC, Program Counter)
: 메모리에서 읽어 들일 명령어의 주소를 저장. 명령어 포인터(IP, Instruction Pointer)라고 부르는 CPU도 있다.
명령어 레지스터(IR, Instruction Register)
: 메모리에서 읽어 들인 명령어를 저장. 제어장치는 명령어 레지스터 속 명령어를 받아들이고 해석한 뒤 제어 신호를 내보낸다.
메모리 주소 레지스터(MAR, Memory Address Register)
: 메모리의 주소를 저장.
메모리 버퍼 레지스터(MBR, Meomory Buffer Register)
: 메모리와 주고받을 값(데이터와 명령어)을 저장. 메모리 데이터 레지스터(MDR, Memory Data Register)라고도 부른다.
플래그 레지스터(flag register)
: 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터
범용 레지스터(general purpose register)
: 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터.
스택 포인터
베이스 레지스터
스택 주소 지정 방식은 스택과 스택 포인터(stack pointer)를 이용한 주소 지정 방식이다. 스택 포인터란 스택의 꼭대기를 가리키는 레지스터로 스택의 어디까지 데이터가 채워져 있는지에 대한 표시이다.
💡 스택? 한쪽 끝이 막혀 있는 통과 같은 저장 공간이다. 가장 최근에 저장하는 값부터 꺼낼 수 있다(Last In First Out, LIFO). 이는 메모리 안에 스택처럼 사용할 영역이 정해져 있으며 스택 영역이라고 한다.
오퍼핸드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식
변위 주소 지정 방식을 사용하는 명령어는 연산 코드 필드, 레지스터 필드, 오퍼랜드 필드가 있다.
어떤 레지스터를 더하는지에 따라 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식으로 나뉜다.
오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식. 모든 코드를 실행하는 것이 아닌, 분기 하여 특정 주소의 코드를 실행할 때 사용.
오퍼랜드와 베이스 래지스터의 값을 더하여 유효 주소를 얻는 방식.
베이스 레지스터 = 기준주소, 오퍼랜드 = 기준 주소로부터 떨어진 거리의 역할을 하며 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소 접근할 것인지를 연한하여 주소를 얻어낸다.
프로그램은 수많은 명령어로 이루어져 있고, CPU는 이 명령어들을 하나씩 실행한다. 이때 명령어들은 일정한 주기로 반복되며 실행한다. 이를 명령어 사이클(instruction cycle)이라고 한다.
명령어 사이클 과정
1. 인출 사이클(fetch cycle) - 메모리에 있는 명령어를 CPU로 가지고 오는 단계
2. 실행 사이클(execution cycle) - 가져온 명령어를 실행하는 단계
: 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시킨다.
간접 주소 지정 방식의 경우 명령어를 인출하여 CPU로 가져왔다 하더라도 곧바로 실행할 수 없는 데, 명령어를 실행하기 위해 메모리 접근을 한 번 더 해야 한다. 이 단계를 간접 사이클(indirect cycle)이라고 한다.
CPU가 수행 중인 작업은 방해를 받아 잠시 중단될 수 있는데, CPU의 작업을 방해하는 신호를 인터럽트(interupt)라고 한다.
인터럽트의 종류
동기 인터럽트(synchronous interupt)
비동기 인터럽트(asynchronous interupt)
하드웨어 인터럽트는 알림과 같은 인터럽트다. 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용된다.
하드웨어 인터럽트 처리 순서
인터럽트 플래그가 불가능으로 설정되어 있어도 무시할 수 없는 인터럽트 요청잉 있는데 정전이나 하드웨어 고장 같은 우선순위가 가장 높은 인터럽트가 이에 해당 된다.
인터럽트 서비스 루틴(Interupt service Routine, ISR)
: 인터럽트 핸들러라고도 부르며, 어떻게 작동할지에 대한 정보로 이루어진 인터럽트를 처리하기 위한 동작들로 프로그램.
인터럽트 벡터(interupt vector)
: 인터럽트 서비스 루틴을 식별하기 위한 정보.