CPU 구조
CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느립니다. ALU가 연산할 때마다 결과를 메모리에 저장한다면 당연하게도 CPU는 메모리에 자주 접근하게 되고, 이는 CPU가 프로그램을 실행하는 속도를 늦출 수 있습니다. 그래서 ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장하는 것입니다.
ALU

ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인다. ALU는 레지스터와 제어장치로부터 받아들인 피연산자와 제어 신호로 산술연산, 논리 연산등 다양한 연산을 수행한다.
ALU는 계산 결과와 더불어 플래그를 내보낸다. 이진수만 봐서는 음수 인지 양수인지 판단하기 어려울 때 음수와 양수를 구분하기 위해 플래그를 사용한다. 이처럼 때때로 ALU는 결괏값뿐만 아니라 연산 결과에 대한 추가적인 정보를 내보내야 할 때가 있다. 가령 연산 결과가 음수일 때, ALU는 '방금 계산한 결과는 음수'라는 추가적인 정보를 내보낸다. 혹은 연산 결과를 담을 레지스터보다 클 때 ALU는 '결괏값이 너무 크다'라는 추가적인 정보를 내보낸다.
연산 결과가 연산 결과를 담을 레지스터보다 큰 상황을 오버플로우(overflow)라고 합니다.
이러한 연산 결과에 대해 추가적인 상태 정보를 플래그(flag)라고 합니다. ALU가 내보내는 대표적인 플래그는 아래와 같다.
| 플래그 종류 | 의미 | 사용 예시 |
|---|---|---|
| 부호 플래그 | 연산의 결과의 부호를 나타낸다. | 부호 플래그가 1일 경우 계산 결과는 음수, 0일 경우 계산 결과는 양수를 의미한다. |
| 제로 플래그 | 연산 결과가 0인지 여부를 나타낸다. | 제로 플래그가 1일 경우 연산 결과는 0, 0일 경우 연산 결과는 0이 아님을 의미한다. |
| 캐리 플래그 | 연산 결과 올림수나 빌림수가 발생했는지를 나타낸다. | 캐리 플래그가 1일 경우 올림수나 빌림수가 발생했음을 의미하고, 0일 경우 발생하지 않았음을 의미한다. |
| 오버플로우 플래그 | 오버플로우가 발생했는지를 나타낸다. | 오버플로우 플래그가 1일 경우 오버플로우가 발생했음을 의미하고, 0일 경우 발생하지 않았음을 의미한다. |
| 인터럽트 플래그 | 인터럽트가 가능한지를 나타낸다. | 인터럽트 플래그가 1일 경우 인터럽트가 가능함을 의미하고, 0일 경우 인터럽트가 불가능함을 의미한다. |
| 슈퍼바이저 플래그 | 커널 모드로 실행 중인지, 사용자 모드로 실행중인지 나타낸다. | 슈퍼바이저 플래그가 1일 경우 커널 모드로 실행 중임을 의미하고, 0일 경우 사용자 모드로 실행 중임을 의미한다. |
이러한 플래그는 CPU가 프로그램을 실행하는 도중 반드시 기억해야 하는 일종의 참고 정보이다. 그리고 플래그들은 플래그 레지스터라는 레지스터에 저장된다. 플래그 레지스터는 이름 그대로 플래그 값들을 저장하는 레지스터이다.
