목표 : 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문이 실행된다.
'개념공부 > 컴퓨터구조와 운영체제' 카테고리의 다른 글
04장 - 3 : 명령어 사이클과 인터럽트 (0) | 2025.04.03 |
---|---|
04장 -2 레지스터 (0) | 2025.04.02 |
03장 - 2 : 명령어의 구조 (0) | 2025.03.28 |
03장 - 1 : 소스 코드와 명령어 (0) | 2025.03.26 |
02장 -2 : 0과 1로 문자를 표현하는 방법 (0) | 2025.03.26 |