03. 컴퓨터 구조에서 컴퓨터의 작동 구조와 함께 CPU에 대해 간단하게 알아보았습니다.
이번에는 더 깊게 들어가서, CPU의 내부를 구성하는 레지스터에 대해 알아보겠습니다.
레지스터란, 플립플롭 여러 개가 연결되어, 값을 저장할 수 있는 고속 메모리입니다.
플립플롭 : 데이터를 저장할 수 있는 조합논리회로
CPU는 안에는 레지스터들이 있고, 연산을 처리하는 데 필요한 데이터를 레지스터가 저장하게 됩니다.
램이나 보조 기억 장치같은 메모리와는 다르게 데이터를 오래 저장하는 용도가 아닌,
순간의 연산을 위해 아주 짧은 시간동안 데이터를 저장하는 장치입니다.
레지스터는 목적에 따라 범용 레지스터, 특수 레지스터로 구분됩니다.
범용 레지스터는 연산 처리에 직접적으로 사용되는 데이터를 저장하는 레지스터이고,
특수 레지스터는 특수한 목적으로 사용되는 레지스터이며, 용도와 기능으로 구분됩니다.
범용 레지스터는 개발자가 원한다면 용도를 변경하여 사용할 수도 있습니다.
https://ajy1120.tistory.com/10
최초 Intel의 CPU는 16비트(=WORD)였으며, 범용 레지스터의 이름도 AX, CX와 같은 형식이었습니다.
CPU가 발달하면서 32비트(=DWORD) CPU에서는 E,
64비트(=QWORD) CPU에서는 R을 붙여 각각 EAX, RAX와 같은 이름을 사용하게 되었습니다.
WORD : 16비트 데이터를 나타내는 단위
프로그램 카운터(Program Counter: PC) : 다음 인출할 명령어의 주소를 가진 레지스터입니다.
누산기(Accumulator: AC) : 연산 결과를 임시로 저장하는 레지스터입니다.
명령어 레지스터(Instruction Register: IR) : 가장 최근에 인출된 명령어가 저장된 레지스터입니다.
기억 장치 주소 레지스터(Memory Address Register: MAR) : CPU가 메모리에 데이터를 읽거나 쓰려는 메모리 주소를 일시적으로 저장하는 레지스터입니다.
기억 장치 버퍼 레지스터(Memory Buffer Register: MBR) : 메모리로부터 읽힌 데이터나 메모리에 쓰일 데이터를 일시적으로 저장하는 레지스터입니다.
데이터 레지스터(Data Register) : 메모리에서 읽어온 데이터(피연산자)를 저장하는 레지스터입니다.
상태 레지스터(Status Register) : 산술 연산의 결과의 상태를 알려주는 레지스터입니다.
특수 레지스터는 CPU가 명령을 처리하는 과정을 보면서 다시 알아보겠습니다.
CPU가 명령을 수행하는 과정은 다음과 같은 순서로 진행됩니다.
----------- 명령어 인출 사이클 ------------ 명령어 인출(Instruction Fetch) : 메모리로부터 명령어를 읽어옵니다. ↓ ----------- 명령어 실행 사이클 ------------ 명령어 해독(Instruction Decode) : 인출할 명령어를 해독하고, 수행해야 할 동작을 결정합니다. ↓ 데이터 인출(Data Fetch) : 연산을 위해 필요한 데이터(피연산자)가 있을 경우 데이터의 주소와 데이터를 인출합니다. ↓ 데이터 처리(Data Process) : 산술 또는 논리 연산을 실행하여 데이터를 처리합니다. ↓ 데이터 저장(Data Store) : 결과값을 메모리에 저장합니다.
밑에서 각 사이클을 마이크로 연산으로 나타내 보겠습니다.
t0 ~ t2 까지 클럭 주기로, 실행 순서를 나타냅니다. ------------------------------- t0 ㅡ MAR <- PC ㅡ 현재의 PC 데이터(명령어 주소)를 MAR로 전송합니다. t1 ㅡ MBR <- M[MAR] ㅡ 메모리에 있는 MAR의 주소로 가서 읽은 명령어를 MBR로 전송, 적재합니다(=인출). t1 ㅡ PC <- PC + 1 ㅡ PC에 1을 더해 다음 명령어의 주소를 나타냅니다. t2 ㅡ IR <- MBR ㅡ MBR에 있는 명령어 코드를 명령어 레지스터(IR)로 전송합니다.
실행 사이클은 크게 4가지로 나뉩니다.
데이터 이동 : CPU와 기억장치 간 혹은 CPU와 I/O 장치 간에 데이터를 이동한다. ex) LOAD A : A 주소에 있는 값을 AC에 덮어 씌운다. t0 ㅡ MAR ← IR(A) ㅡ A의 주소를 MAR에 저장합니다. t1 ㅡ MBR ← M[MAR] ㅡ 메모리에 있는 MAR의 데이터(A의 데이터)를 MBR에 저장합니다. t2 ㅡ AC ← MBR ㅡ 데이터를 AC에 덮어 씌웁니다.
데이터 처리 : 데이터에 대하여 산술 혹은 논리 연산을 수행한다. ex) ADD A : AC에 A 주소에 있는 값을 더한다. t0 ㅡ MAR ← IR(A) ㅡ A의 주소를 MAR에 저장합니다. t1 ㅡ MBR ← M[MAR] ㅡ 메모리에 있는 MAR의 데이터(A의 데이터)를 MBR에 저장합니다. t2 ㅡ AC ← AC+MBR ㅡ AC와 MAR의 데이터를 더합니다.
데이터 저장 : 연산결과 데이터 혹은 입력장치로부터 읽어들인 데이터를 기억장치에 저장한다. ex) STA A : A에 결과 값을 저장합니다. t0 ㅡ MAR ← IR(A) ㅡ A의 주소를 MAR에 저장합니다. t1 ㅡ MBR ← AC ㅡ MBR에 AC의 값을 임시 저장합니다. t2 ㅡ M[MAR] ← MBR ㅡ 메모리에 있는 A에 MBR의 값을 저장합니다.
프로그램 제어 : 프로그램의 실행 순서를 결정한다. ex) JUMP A : A의 명령어로 실행 순서를 바꿉니다. t0 ㅡ PC ← IR(A) ㅡ A의 주소를 PC에 저장합니다.
https://ajy1120.tistory.com/10
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ndb796&logNo=220687216382
https://gamedevlog.tistory.com/71
https://velog.io/@onenewarm/%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4
https://www.harucat.com/entry/%EC%8B%A4%ED%96%89-%EC%82%AC%EC%9D%B4%ED%81%B4