[System Programming] CPU Instruction Cycle

Geon·2023년 3월 19일
0

CS

목록 보기
6/9
post-thumbnail

CPU가 메모리에 있는 명령어들을 어떻게 처리하는지 알아보자. 우선 CPU에게 전달되는 명령어가 어떻게 생겼는지 알아야 한다. (16비트의 CPU 프로세서로 가정하기에 명령어 한줄의 사이즈도 16비트)

CPU가 받아들이는 명령어는 앞 4비트는 어떤 명령어를 수행할지 나타내는 명령 코드이고, 이후 12비트는 이 명령에 이용될 피연산자(Operand)의 데이터나, 주소를 담고있다.
CPU의 Instruction Cycle은 메모리에서 명령과 데이터를 CPU로 가져오는 Fetch와 가져온 명령어를 분석하여 어떤 명령인지를 밝히는 Decode, 이후 이를 실행하는 Execute로 나눌 수 있다.

아래는 본인이 임의로 정의한 Opcode 목록이다.(Opcode는 실제로 프로세서의 종류마다 모두 다르기 때문에 꼭 지켜야 하는 정해진 명령코드 형식은 없다.)

0 0 0 1 : 메모리에서 AC로 저장하는 명령코드
0 0 1 0 : AC에서 메모리로 저장하는 명령코드
0 1 0 1 : 현재 AC에 있는 값에 메모리에 있는 값을 더하는 명령코드

자 그럼 아래와 같은 명령어 한줄을 Fetch / Decode / Execute 한다고 치자.

(우리는 명령어의 크기를 16비트로 지정했으니 1, 9, 4, 0은 각각 4비트씩을 차지하고 있는 것이다.)

여기서 맨 앞의 1은 4비트니까 명령코드 자리이고, 이를 풀어서 계산하면 0001 이니까 메모리에서 AC로 저장하는 명령코드임을 알수있다. 그럼 뒤의 9 4 0이 12비트일 것이므로 940 번지에 있는 데이터를 가르킬 것이다. 즉 위의 1 9 4 0 이라는 명령은 '메모리의 940번지 주소에 있는 값을 AC에 담아라' 라는 명령인 것이다. 감을 잡았다면 이제 아래의 예시를 통해 전체적인 과정을 살펴보자. (예시에서는 Decode단계는 Execute Cycle 단계 안에 포함되는 것으로 간주한다.)

*아래의 사이클을 이해하기 위해선 CPU 구조에 대한 지식이 필요하다. 여기서 CPU의 Core 부분의 레지스터들을 한번 더 정리하고 오자.

한단계씩 풀어 설명해보겠다.

Fetch - Step1

1. PC -> MAR
PC에 저장되어 있는 다음번 실행 주소 (300번지)을 MAR에게 건넨다.
2. PC <- PC+1
PC는 다음번 실행할 주소(301번지) 을 저장한다.
3. Memory[MAR] -> MBR
메모리에서 MAR에 저장된 주소(300번지)에 해당하는 데이터를 MBR에 담는다(1940)
4. MBR -> IR
MBR에 담겨있는 데이터(1940)을 IR로 담는다.
(이처럼 IR와 PC에 접근하는 것은 주로 CU가 담당한다.)

Decode & Execute - Step2

1. IR에 담겨있는 명령어(1940)를 분석한다.
1-1. 우선 첫 4비트의 명령코드를 분석하여 AC에 저장하는 명령임을 알았다.
1-2. IR(940)->MAR
데이터가 담긴 주소를 뒤의 12비트를 분석하여 알아내고(940번지), IR은 이 정보를 MAR에 보낸다.
2. Memory[MAR]->MBR
메모리에서 MAR에 저장된 주소(940번지)에 해당하는 데이터를 MBR에 담는다(0003)
3. MBR->AC
AC에 저장하라는 명령어대로 MBR의 데이터를 AC에 저장한다.

Fetch - Step3

1. PC -> MAR
PC에 저장되어 있는 다음번 실행 주소 (301번지)을 MAR에게 건넨다.
2. PC <- PC+1
PC는 다음번 실행할 주소(302번지) 을 저장한다.
3. Memory[MAR] -> MBR
메모리에서 MAR에 저장된 주소(301번지)에 해당하는 데이터를 MBR에 담는다(5941)
4. MBR -> IR
MBR에 담겨있는 데이터(5941)을 IR로 담는다.

Decode & Execute - Step4

1. IR에 담겨있는 명령어(5941)를 분석한다.
1-1. 우선 첫 4비트의 명령코드를 분석하여 AC에 값을 더하여 AC에 저장하는 명령임을 알았다.
1-2. IR(941) -> MAR
데이터가 담긴 주소를 뒤의 12비트를 분석하여 알아내고(941번지), IR은 이 정보를 MAR에 보낸다.
2. Memory[MAR] -> MBR
메모리에서 MAR에 저장된 주소(941번지)에 해당하는 데이터를 MBR에 담는다(0002)
3. AC <- AC+MBR
명령코드대로 MBR의 데이터를 AC에 더하고 AC에 저장한다.

Fetch - Step5

1. PC -> MAR
2. PC <- PC+1
3. Memory[MAR] -> MBR
4. MBR -> IR

Decode & Execute - Step6

1. IR에 담겨있는 명령어(2941)를 분석.
1-1. 우선 첫 4비트의 명령코드를 분석하여 AC에 있는 데이터를 메모리에 저장하는 것을 알았다.
1-2. IR(941) -> MAR
데이터가 담긴 주소를 뒤의 12비트를 분석하여 알아내고(941번지), IR은 이 정보를 MAR에 보낸다.
2. AC -> MBR
(메모리와 AC는 직행으로 연결되어있지 않기에 우선 MBR에게 전달해준다.)
3. MBR -> Memory[MAR]
AC에 있는 값을 메모리에 저장하라는 명령을 최종적으로 완수한다.



References :

profile
별에 별 지식 저장해놓고 꺼내먹기📚

0개의 댓글