중앙처리장치(CPU)는 크게 연산장치, 제어장치, 레지스터 3가지로 구성되어 있다.
연산 장치
- 연산에 필요한 데이터를 레지스터에서 가져오고, 연산 결과를 다시 레지스터로 보낸다.
제어 장치
- 명령어를 순서대로 실행할 수 있도록 제어하는 장치
- 주기억장치에서 프로그램 명령어를 꺼내 해독하고, 그 결과에 따라 명령어 실행에 필요한 제어 신호를 기억장치, 연산장치, 입출력장치로 보냄
- 또한 이들 장치가 보낸 신호를 받아, 다음에 수행할 동작을 결정함
- 내부 구성
- 기억장치 버퍼 레지스터, 기억장치 주소 레지스터, 명령 레지스터, 명령 해독기, 프로그램 카운터
레지스터
- 명령어 주소, 코드, 연산에 필요한 데이터, 연산 결과 등을 임시로 저장
- 용도에 따라 범용 레지스터, 특수 목적 레지스터로 구분된다.
- CPU에 따라 사용할 수 있는 레지스터 개수와 크기가 다르다.
- 범용 레지스터
- 연산에 필요한 데이터나 연산 결과를 임시로 저장
범용 목적 레지스터
ECX |
반복문에서 카운터로 사용 |
EDX |
EAX와 함께 사용되어 연산을 보조 |
EBX |
메모리 주소를 저장 |
EDI |
문자열 연산에서 사용되는 목적 주소를 저장 |
ESP |
스택의 제일 윗부분의 주소를 저장 |
EBP |
스택의 제일 아랫부분의 주소를 저장 |
ESI |
문자열 연산에서 사용되는 원본 주소 저장 |
R8~R15 |
64비트에서 추가된 레지스터, 다양한 용도로 사용
|
- CPU가 발달함에따라 32비트에서는 (=DWORD) CPU에서는 E, 64비트에서는(=QWORD) CPU에서는 R을 붙여 각각 EAX, RAX와 같은 이름을 사용하게 되었다.
특수 목적 레지스터
프로그램 카운터(PC) |
다음 인출할 명령어 주소를 가진 레지스터 |
누산기(AC) |
연산 결과를 임시로 저장하는 레지스터 |
명령어 레지스터(IR) |
가장 최근에 인출된 명령어가 저장된 레지스터 |
기억 장치 주소 레지스터(MAR) |
CPU가 메모리에 데이터를 읽거나 쓰일 데이터를 일시적으로 저장하는 레지스터 |
데이터 레지스터(DR) |
메모리에서 읽어온 데이터를 저장하는 레지스터 |
상태 레지스터(SR) |
산술 연산의 결과 상태를 알려주는 레지스터 |
CPU의 동작 과정
- 명령어 인출 사이클
- 명령어 인출(Instruction Fetch) : 메모리부터 명령어를 읽어온다.
- 명령어 실행 사이클
- 명령어 해독(Instruction Decode) : 인출할 명령어를 해독하고, 수행할 동작을 결정한다.
- 데이터 인출(Data Fetch) : 연산을 위해 필요한 데이터가 있을 경우 데이터의 주소와 데이터를 인출한다.
- 데이터 처리(Data Process) : 산술 또는 논리 연산을 실행하여 데이터를 처리한다.
- 데이터 저장(Data Store) : 결과값을 메모리에 저장한다.
명령어 세트
- 연산 코드(실행할 연산) + 피연산자(필요한 데이터 or 저장 위치)
- CPU가 주기억장치에서 한번에 하나의 명령어를 인출하여 실행하는데 필요한 활동을 명령어 사이클이라고 한다.
- 인출/실행/간접/인터럽트 사이클로 나누어진다.
- 주기억장치의 지정된 주소에서 하나의 명령어를 가져오고, 실행 사이클에서는 명령어를 실행함. 하나의 명령어 실행이 완료되면 그 다음 명령어에 대한 인출 사이클 시작한다.
인출 사이클
T0: MAR <- PC // PC에 저장된 주소를 MAR로 전달
T1: MBR <- M[MAR], PC <- PC + 1 // 인출할 명령어를 MBR에 저장, 다음 명령어 인출을 위해 PC값 증가
T2: IR <- MBR // MBR에 저장된 내용을 IR에 전달
실행 사이클
데이터 이동 : LOAD addr
- 우선 IR에 저장된 명령어의 주소값을 MAR을 통하여 기억장치로 보내 데이터를 인출한다.
- 이 명령어 수행시, 기억장치에 저장되어 있던 데이터를 AC로 이동하게 된다.
데이터 처리 : ADD addr
- ADD는 AC에 있는 값과, 기억장치로부터 불러온 새로운 값을 더하여 그 값을 다시 AC에 저장한다.
데이터 저장 : STA addr
- 먼저 LOAD처럼 IR에 저장된 명령어 주소값을 MAR에게 전달한 후 , AC에 저장되어 있던 데이터를 MBR로 가져온다.
- 이후, MBR로 가져온 데이터를 기억장치의 addr번지에 저장시켜준다.
프로그램 제어 : JUMP addr
- 실행 사이클에서는 addr를 PC에 적재만 하면 된다.
// LOAD addr
T0: MAR <- IR(addr)
T1: MBR <- M[MAR]
T2: AC <- MBR
// ADD addr
T0: MAR <- IR(addr)
T1: MBR <- M[MAR]
T2: AC <- AC + MBR
// STA addr
T0: MAR <- IR(addr)
T1: MBR <- AC
T2: M[MAR] <- MBR
// JUMP addr
T0: PC <- IR(addr)