Instruction Cycle = Fetch Cycle + Execute Cycle
Instruction Cycle를 좀 더 세부적으로 살펴보면 위와 같습니다. 단계별로 살펴보겠습니다.
명령어 인출(Instruction fetch) : Instrcution address calculation과 Instruction fetch, 즉 명령어 주소를 계산하고 그 주소에 가서 명령어를 가져오는 단계를 수행합니다. fetch cycle이라고 볼 수 있습니다.
명령어 해독(Instruction decode) : Instruction operation decoding을 통해 어떻게 수행, 행위, 동작시킬지 결정한다음
데이터 인출(Data fetch) : Operand address calcution과 Operand fetch. operand는 피연산자(=연산자의 대상. 예를 들어 3+4
에서 피연산자는 3
과 4
가 됩니다). 피연산자 위치를 계산해서 불러옵니다.
데이터 처리(Data process) : Date operation을 해서 피연산자를 operation(=연산) 시켜줍니다.
데이터 저장(Data store) : Operand address calcution과 Operand store. 연산을 했으면 그 결과를 어디에 저장할 것인지에 대한 동작을 수행합니다.
이런 과정을 끊임없이 반복 수행합니다.
먼저 CPU의 명령어 처리 과정을 설명하기에 앞서 CPU의 구조에 대해서 간단하게 설명하겠습니다.
산술 논리장치(Arithmetic logic unit, ALU) : 두 숫자의 (덧셈, 뺄셈같은) 산술연산과 (배타적 논리합, 논리곱, 논리합같은) 논리연산을 계산하는 디지털 회로입니다. 산술논리장치는 컴퓨터 중앙처리장치의 기본 설계 블록입니다.
레지스터 세트(register set) : CPU 내부에 위치한 기억장치입니다. 액세스 속도가 매우 빠르지만, 내부 회로가 복잡하여 큰 공간을 차지하기 때문에 CPU내부의 레지스터 개수는 제한적입니다. 용도에 따라 범용 레지스터와 특수 목적 레지스터로 구분됩니다.
제어 장치(control unit) : 컴퓨터에 있는 모든 장치들의 동작을 지시하고 제어하는 장치입니다. 제어장치는 명령 레지스터에서 읽어들인 명령어를 해독하여 해당하는 장치에게 제어 신호를 보내 정확하게 수행하도록 지시합니다.
CPU 내부 버스 : ALU와 레지스터들 간의 데이터 이동을 위한 데이터, 주소 선들. 제어 장치로부터 발생되는 제어 신호를 전송하는 선들로 구성
이제 CPU 내부 특수 목적 레지스터 세트에는 어떤 레지스터가 있는지 알아보겠습니다.
PC (Program Counter, 프로그램 카운터) : 다음에 인출될 명령어의 주소를 가지고 있는 레지스터 입니다. 현재 A주소의 명령어를 실행 중일 경우 PC값은 A+1입니다.
MAR(Memory Address Register, 메모리 주소 레지스터) : PC에 저장된 명령어 주소가 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터
MBR(Memory Buffer Register, 메모리 버퍼 레지스터) : 기억장치에 저장될 혹은 읽혀진 데이터가 일시적으로 저장되는 버퍼 레지스터
IR (Instruction register, 명령어 레지스터) : 가장 최근에 인출된 명령어가 저장되어 있는 레지스터
AC (Accumulator, 누산기) : 연산 결과 데이터를 일시적으로 저장하는 레지스터
MAR ← PC : PC가 가리키는 기억장치의 위치를 MAR에 저장시켜줍니다. PC의 값이 외부의 주소버스로 가기 위해서는 MAR을 거쳐야 합니다.
MBR ← M[MAR], PC ← PC + 1 : MAR을 거쳐서 외부로 나가고, 메모리(M)의 값을 찾아 데이터 버스를 타고 MBR에 저장시켜줍니다. 그런다음 PC 값은 1 증가시켜줍니다.
IR ← MBR : MBR이 해석되기 위해서 IR을 거쳐야 합니다.
아래의 (1)~(4)번은 필수적인 과정이 아니라, 명령어에 따라 달라집니다.
데이터 이동: CPU와 기억장치,I/O장치 간에 데이터를 이동합니다. ex) LOAD addr
데이터 처리: 데이터에 대하여 산술,논리 연산을 수행합니다. ex) STA addr
데이터 저장: 연산결과 데이터나 입력장치로부터 읽어들인 데이터를 기억장치에 저장합니다. ex) ADD addr
프로그램 제어: 프로그램의 실행 순서를 결정합니다. ex) JUMP addr
가령 가장 만만한 ADD addr 명령어 연산을 보면 다음과 같이 진행됩니다.
Fetch Cycle로 메모리로부터 가져온 명령어 ADD addr가 IR에 있을 것입니다. 이를 이용해 다시 명령어 주소를 MAR로 보내고 기억장치의 MAR번지의 값을 MBR로 가져와서 AC의 값과 더해준 뒤, 다시 AC에 저장해줍니다.
명령어 포맷입니다. 명령어는 일반적으로 Opcode(명령코드) 와 피연산자를 나타내는 Operand의 데이터나 데이터의 주소를 가집니다.
Opcode(명령코드)는 기계어의 일부이며 수행할 명령어를 나타내는 부호를 말합니다. 이에 대한 규격과 형식은 프로세서 명령어 집합에 나와 있습니다. 여기서는 아래와 같이 Opcode가 존재한다고 해보겠습니다.
Operand는 하나 이상의 지정자를 가집니다. 일부 연산에 대하서는 연산 자체가 묵시적으로 피연산자를 갖고 있는 경우도 있고, 피연산자를 아예 갖지 않는 연산도 있습니다.
결론적으로 Opcode(명령코드)도 컴퓨터마다 다르고, 명령어 포맷도 컴퓨터마다 다릅니다. 여기서는 위와 같이 예를 든것입니다.
왼쪽에있는게 fetch단계이고 오른쪽에 있는게 execute단계입니다.
1단계. PC는 3 0 0
번지를 가리키고 있습니다. PC는 MAR에게 주소를 넘겨주고 이 주소로 가서 명령어 값을 가져와 MBR안에 저장합니다. MBR에 있는 값은 IR로 가게되고 지금 나타난 1 9 4 0
도 이와같은 과정을 거쳐서 저장된 것입니다. 1 9 4 0 은 16진수이다. 그래서 0001_1001_0100_0000
로 표현할 수 있습니다.
2단계. 앞에 4비트는 opcode이므로 0001은 찾아보면 Load AC from Memory라는 명령인것을 알 수 있습니다. 즉, 메모리로부터 9 4 0번지에 있는 데이터를 가져와서 AC에 load해라 라는 의미가 되겠습니다.
3,4,5,6 단계 역시 1,2단계에서 크게 벗어나지 않으므로 생략하겠습니다.
오늘은 진짜 정말 중요한 내용에 대해 공부했습니다. 사실 이거 몰라도 개발자로서는 큰 영향은 없지만 그래도 이런 내용을 알면 좀 더 뿌듯할 듯 싶습니다.
https://www.jobilize.com/course/section/instruction-cycle-state-diagram-by-openstax
CPU의 구조와 기능(1) : https://m.blog.naver.com/PostView.nhn?blogId=jaeyoon_95&logNo=221053588562&proxyReferer=https:%2F%2Fwww.google.com%2F ★★★★★
위키피디아 산술논리 장치 : https://ko.wikipedia.org/wiki/%EC%82%B0%EC%88%A0_%EB%85%BC%EB%A6%AC_%EC%9E%A5%EC%B9%98
[H/W] 중앙처리장치(CPU)란 무엇인가? CPU의 구조 총정리 : https://coding-factory.tistory.com/351
중앙처리장치(CPU)의 작동 원리를 알아보자! : https://ndb796.tistory.com/7 ★★★
안녕하세요!! 내용이 정말 좋은 것 같습니다 학생이라 배우고 있는데 많은 도움이 되는 것 같습니다.
그런데 Execute Cycle 에서 데이터 처리는 Add addr , 데이터 저장은 STA addr가 아닌지 헷갈려서 댓글을 남깁니다. 바쁘지 않으실 때 확인하여 답글 남겨주시면 감사하겠습니다.
다시 한번 지식 공유 감사드립니다 ㅎㅎ