CPU의 작동원리1️⃣ - 사칙연산, ALU, 제어장치
컴퓨터의 사칙연산
컴퓨터가 덧셈을 하는 방법은 다음과 같다.
A가 1이고, B가 1이면 XOR 연산 시, 결과 S는 0이된다.
만약 A가 1이고 B가 1이면 AND 연산 시, 결과 C는 1이된다. 그리고 이 C는 자리올림(Carry)이다.
예를 들어 1bit A에 전류가 들어왔고, 1bit B에 전류가 들어왔다면 둘 다 전류가 들어왔으므로 AND 연산 시 1이 된다.
이를 이진수 체계에서는 1 + 1 = 10 으로 표현할 수 있는데 이때 자리올림이 발생한 것을 알 수 있다.
하지만 이런 경우는 1bit씩 더하는 것 한정이다. 만약 8bit끼리 덧셈을 하려고 한다면 전가산기를 이용해야한다.
"핵심은 더하기가 가능하면 CPU 연산이 가능하다는 것이다."
뺄셈도 더하기의 개념이다. 바로 보수의 덧셈이다.
13 - 6은 컴퓨터 입장에서 이진수로 표현했을 때 1101 - 0110 이다.
이때 빼려는 수의 2의 보수를 구하면 1001 + 1 = 1010 이다.
그리고 1101 + 1010 = 10111인데 자리올림은 버린다. 따라서 0111이 된다.
0111은 십진수로 7이므로 정답이다.
곱셈과 나눗셈은 bit shift이다. 곱셈은 left shift이고, 나눗셈은 right shift이다.
5를 4비트로 표현하면 0101이다. 0101을 왼쪽으로 밀면 맨 오른쪽에 0이 채워져 01010이 되는데 자리올림을 버리면 1010이다.
왼쪽으로 한 칸을 밀면 곱하기 2, 두 칸을 밀면 곱하기 4가 된다.
반대로 6을 4비트로 표현하면 0110인데 오른쪽으로 밀면 00110이 되고 맨 오른쪽을 잘라 0011이 된다. 0011은 십진수로 3이다.
ALU

ALU는 그림과 같이 레지스터로부터 피연산자를 받고 제어장치로부터 제어신호를 받아 산술, 논리 연산 등 다양한 연산을 수행한다. 그리고 결과값은 곧바로 메모리에 저장되지 않고 레지스터에 일시적으로 저장된다. 이유는 메모리에 직접 접근하는 것보다 레지스터에 접근하는 속도가 훨씬 빠르기 때문이다.
또한 ALU는 플래그 레지스터에게 플래그를 보낸다. 플래그는 연산 결과에 대한 추가적인 상태 정보를 의미한다.
ALU가 보내는 대표적인 플래그는 아래와 같다.
- 부호 플래그 : 연산한 결과의 부호를 나타낸다.
- 제로 플래그 : 연산 결과가 0인지 여부를 나타낸다.
- 캐리 플래그 : 연산 결과 올림수나 빌림수가 발생했는지를 나타낸다.
- 오버플로우 플래그 : 오버플로우가 발생했는지를 나타낸다.
- 인터럽트 플래그 : 인터럽트가 가능한지를 나타낸다.
- 슈퍼바이저 플래그 : 커널모드로 실행중인지, 사용자 모드로 실행중인지를 나타낸다.
제어장치
제어장치는 제어 신호를 내보내고, 명령어를 해석하는 부품이다. 그리고 제어 신호는 컴퓨터 부품을 관리하고 작동시키기 위한 일종의 전기 신호이다.

제어 장치가 받아들이는 정보는 다음과 같다.
- 제어장치는 클럭신호를 받아들인다.
- 클럭이란 한 주기에 맞춰 한 레지스터로부터 다른 레지스터로 데이터가 이동하거나 ALU가 연산을 하거나 등등 컴퓨터 부품들을 움직이게 하는 시간 단위이다.
- 제어장치는 해석해야할 명령어를 받아들인다.
- CPU가 해석해야할 명령어는 명령어 레지스터에 저장된다. 그리고 제어장치는 명령어 레지스터로부터 해석해야할 명령어를 받아들이고 해석한 다음, 제어신호를 발생시켜 어떤 명령을 수행해야하는지 알려준다.
- 제어장치는 플래그 레지스터 속 플래그 값을 받아들인다.
- 제어장치는 제어 버스로 전달된 제어 신호를 받아들인다.
- 시스템 버스에는 주소버스, 제어버스, 데이터버스가 있고 그 중에 제어장치는 제어버스로부터 전달되는 제어신호를 받아들인다.
- 제어장치는 크게 CPU 외부에 전달하는 제어신호와 CPU 내부에 전달하는 제어신호가 있다.
- CPU 외부에 전달하는 제어신호의 종류는 다음과 같다. 메모리에 새로운 값을 읽고 싶을 때 제어장치는 제어버스를 통해 CPU 외부에 있는 메모리에게 제어신호를 보낸다. 그리고 입출력 장치의 값을 읽거나 새로운 값을 쓰고 싶을 때 입출력 장치에게 제어신호를 보낸다.
- CPU 내부에 전달하는 제어신호는 ALU에게 연산을 지시하는 제어신호나 레지스터에 저장된 명령어를 해석하기 위해 레지스터에게 전달하는 제어신호 등이 있다.