개념공부/컴퓨터구조와 운영체제

04장 - 1 : ALU와 제어장치

Cadi 2025. 3. 29. 15:41

 

목표 : ALU와 제어장치가 어떤 정보를 받아들이고 내보내는지를 중심으로 역할을 학습한다.

 

 

 

ALU ( Arithmetic Logic Unit , 산술논리연산장치 )

 

CPU와 ALU의 역할을 간단하게 그린 것이다.

 

ALU는 CPU의 핵심 연산 장치로, 산술 연산(덧셈, 뺄셈 등)과 논리 연산(AND, OR, XOR 등)을 수행한다.

입력값인 피연산자와 수행할 연산을 받아들여 수행한 뒤 그 값을 특정 주소(장소)로 출력한다. 

 

 

 ALU의 입력

 

  • 피연산자(Operand) : 연산을 수행할 값들 , 레지스터로부터 받아온다.
  • 제어 신호 : 제어 장치에서 보내는 신호로 어떤 연산을 수행할지 결정한다.

ALU의 출력

 

  • 연산 결과 : 계산된 값 ( 특정 숫자, 문자, 메모리 주소 등 )은 레지스터에 저장된다.
  • 플래그 값 : 연산 결과의 상태를 나타내는 플래그 값 ( 부호, 제로, 캐리 , 오버플로우 등 )은 플래그 레지스터에 저장.

 

* CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느리다. 그래서 우선 레지스터에 저장한다.

 

 

제어 장치 (Control Unit)

 

제어 장치는 CPU의 명령어 해석 및 실행을 담당하는 장치로, 컴퓨터 내부 장치를 관리하는 제어 신호를 생성한다. 

 

 

 

 

제어 장치의 입력

 

1. 클럭 신호

 

컴퓨터 부품들의 시간 단위.  하나의 명령어가 여러 클럭에 걸쳐 실행될 수 있다.

 

2. 해석해야 할 명령어

 

CPU가 해석해야 할 명령어는 명령어 레지스터라는 레지스터에 저장된다. 제어장치는 이 명령어 레지스터로부터 명령어를 받고 , 해석하고 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려준다. 

 

3. 플래그 레지스터 속 플래그 값

 

ALU 연산에 대한 추가적인 상태 정보인 플래그 값도 받아들여 제어 신호를 발생시킨다. 

 

4. 시스템 버스 중 제어 버스로부터 전달된 제어 신호

 

제어 신호는 CPU 뿐만 아니라 입출력 장치 등 CPU 외부 장치도 발생 가능하다. 이 제어신호를 받아들이기도 한다.

 

제어 장치의 출력

 

1. CPU 내부에 전달하는 제어 신호

  • 레지스터로 제어 신호 전달
  • ALU로 제어 신호 전달

2. CPU 외부에 전달하는 제어 신호

  • 메모리에 전달하는 제어 신호
  • 입출력 장치 ( 보조 기억 장치 포함 ) 에 전달하는 제어 신호

 

질문 : 제어 장치가 왜 플래그 레지스터의 정보를 읽는가 ?

 

ALU는 계산을 위한 도구라고 알고 있었다. 그래서 제어 장치가 ALU에 신호를 보내고 계산이 완료되면 

그냥 바로 레지스터에 저장한 후, 특정 주소의 메모리로 저장되면 되는 것이 아닌가 ? 하는 생각이 있었다.

굳이 제어 장치가 플래그 레지스터에 있는 플래그 값을 읽을 이유가 있나 ? 하는 생각이 들어서 찾아봤다.

 

제어 장치는 명령어를 읽고 실행하는 ( 해석하고 그에 따른 제어 신호를 보내는 ) 장치다. 

따라서 , 예를 들어 "결과가 0이면 특정 분기를 실행하라" 와 같은 조건 분기를 읽고 제어 신호를 보낼 수도 있다.

이 때 , ALU에서 계산된 값이 0이라면, 제로 플래그 레지스터의 값이 1일 것이고 이 플래그 레지스터의 값을 읽고

조건 분기에 맞는 제어 신호를 보내게 되는 것이다. 

즉, 플래그 값은 단순한 연산 결과뿐만 아니라, 분기(조건문 실행), 예외 처리, 오버플로우 감지 등 중요한 역할을 하기 때문이다. 제어 장치는 이러한 플래그 값을 읽여 연산의 상태를 파악하고 적절한 처리를 하기 위해 플래그 값을 읽는다. 

 

다음의 예시를 통해 조금 더 알아보자면

 

1 + 1의 연산 수행 과정이 있다고 해 보자.

 

우선 메모리에서 ADD 1, 1  라는 명령어를 가져와 CPU 내부의 명령 레지스터 (IR) 에 저장한다.

제어 장치는 이 명령어를 해석해서 ALU에게 덧셈을 수행하라고 지시한다.

ALU는 1 + 1 의 결과를 계산하고 결과를 레지스터에 저장한다. 동시에 플래그 레지스터도 업데이트한다. 

제어 장치는 이 플래그 값을 확인한다. ( 예를 들어 결과가 0이면 다른 명령을 수행할 수도 있다 )

이후 결과값을 필요한 레지스터나 메모리에 저장한다. 

 

조금 더 긴 예시를 들어보자. 1 + 1 + 1이 있다고 한다면

ALU가 1 + 1 을 계산해서 결과를 특정 레지스터에 저장하고 플래그 레지스터를 갱신한다.

제어 장치가 다음 명령어로 이동해서 두 번쨰 연산을  ( 2 + 1 ) 하고 결과값을 저장하고 레지스터를 갱신한다.

연산이 끝나면 제어장치가 특정 레지스터의 값을 메모리로 옮기라고 명령하고 옮기게 된다. 

 

질문2 : 그럼 연산이 끝났다 혹은 메모리에 옮기는 기준은 무엇인가 ?

 

C# 기준으로 물어봤다. 혹시 ';' 세미콜론이 연산이 끝나는 기준일까? 해서 물어봤는데 아니라고 한다.

C#에서는 ';'이 코드의 끝을 나타내지만, CPU 입장에서는 어셈블리 명령어 단위로 실행되기 때문이다. 

CPU는 명령어 단위로 실행하고, 한 줄이 끝날 때마다 레지스터/메모리에 값을 저장한다. 

 

플래그 값은 메모리에 저장되지 않고, 연산 직후에만 유효하다.

메모리에 저장된 값을 다시 확인하려면 cmp 같은 비교 연산을 통해 플래그를 설정해야 한다. 

int a = 1 - 1;   // a = 0
if (a == 0) { 명령 }

 

예를 들어 위의 코드에서

1. 1 - 1계산 후 레지스터에 0을 저장한다, ZF(Zero Flag) = 1 

2. a를 메모리에 저장하면서 ZF는 사라진다.

3. if ( a == 0 ) 을 실행 시 , CPU는 CMP 명령어를 사용하여 다시 플래그를 설정한다.

4. CPM a, 0 실행 후 ZF가 1이면 if문이 실행된다.