본문 바로가기

C/기타

CPU가 A+B를 처리하는 방법

[ int A = 3;

  int B = 4;

  int C = A+B;

  라는 코드를 CPU는 어떻게 값을 읽고 저장할까? ]

 

[ 설명전 알았으면 좋겠는 것 ]

 

[ 프로그램 카운터 ]

다음번에 읽어와야 하는 주소를 저장하고 있다.

 

[ 명령어 레지스터 ]

명령어를 저장할수 있다

 

[ 메모리 주소 레지스터 ]

주소를 저장할 수 있다.

 

[ 메모리 데이터 레지스터 ]

메모리의 값을 저장할 수 있다.

 

[ 어큐물레이터 ]

산술 작업을 도와주는 역할을 한다.

 

[ 제어장치 ]

명령어를 해석한다

 

[ 산술 논리 장치(ALU) ]

연산 작업을 한다

 

[참고자료]

 

 

1) OS는 보조기억장치의 프로그램을 읽는다.

  이후 각 주소에 필요한 메모리 값을 저장한다.

(A의 값 3은 주소10에 저장되었고

 B의 값 4는 주소 11에 저장되었다.) 

 

2) 프로그램 카운터에 LOAD의 주소가 저장

-> 100 저장

 

3) 메모리 주소 레지스터가 주소 100을 저장

 

4) 메모리 데이터 제리스터가 주소 100의 메모리 값을 저장한다

-> LOAD라는 명령어를 확인 하였고 명령어 레지스터로 값을 보낸다

 

5) 명령어 레지스터는 LOAD10을 저장한다

 

6) 프로그램 카운터를 1증가시킨다 => 101

 

7) 명령어 레지스터는 제어장치로 값을 보낸다

 

8) 제어장치는 LOAD10을 저장한다

-> 제어장치는 이것이 주소10의 값을 읽으라는 것으로 이해한다

 

9) 때문에 메모리 주소 레지스터는 주소10을 저장한다

 

10) 메모리 데이터 레지스터는 주소10의 메모리값 3을 저장한다

 

11) 어큐물레이터에 3이 저장된다

 

12) ALU로 3이 저장된다

 

13) 한번의 과정이 끝났기에 프로그램 카운터의 주소101을 읽는다

 

14) 메모리 주소 레지스터가 주소102번을 저장

 

15) 메모리 데이터 레지스터가 ADD11을 저장한다

      -> 명령어인 것을 이해하고 명령어 레지스터로 보낸다

 

16) 명령어 레지스터에 값이 저장된다

 

17) 프로그램 카운터를 1증가시킨다 => 102

 

18) 명령어 레지스터는 제어장치러 ADD11을 보낸다

 

19) 제어장치는 ADD11을 저장한다

     -> 제어장치는 11번주소를 더해야 한다는 것을 이해한다

 

19) 메모리 주소 레지스터가 주소11을 저장한다

 

20) 메모리 데이터 레지스터는 11의 메모리값 4을 저장한다

     -> 명령어가 아니기에 어큐물레이터로 값을 전달한다

 

21)어큐물레이터에 4가 저장된다

 

22) ALU에 기존의 값에 +4 형태로 저장된다

     -> 3+4=7

 

23) 결과를 어큐물레이터로 보낸다

 

24) 어큐물레이터에 7이 저장된다

 

25) 한번의 과정이 끝났기에 프로그램 카운터 102를 읽는다

 

26) 메모리 주소 레지스터는 주소102를 저장한다

 

27) 메모리 데이터 레지스터는 STORE12의 값을 얻어낸다

     -> 명령어 인것을 이해하고 명령어 레지스터로 보낸다

 

28) 명령어 레지스터는 STORE12를 저장

 

29) 프로그램 카운터 1증가 => 103

 

30) 명령어 레지스터는 프로그램 카운터 1을 증가

 

31) 명령어 레지스터는 STORE12값을 제어장치로보낸다

 

32) 제어장치는 STROE12를 저장한다 

     -> 제어장치는 12번지에 연산한 값을 저장하는 것으로 이해한다

 

33) 메모리 주소 레지스터는 주소 12를 저장한다

 

34) 메모리 데이터 레지스터는 12의 값을 읽는것이 아니라

     12에 들어갈 값을 저장하도록 제어받고있다

 

35) 이때문에 어큐물레이터는 저장하고 있던 7의 값을

     메모리 데이터 제리스터로 보낸다

 

36) 메모레 데이터 레지스터는 12를 저장

 

37) 12주소에 7이 저장된다. 

 

[ 느낀점 ]

- 이론으로 배울때는 복잡하게 느껴졌는데

  단순한 예시로 흐름을 따라가며 읽으니

  확실히 더 이해가 잘되는 것 같다.

 

- C언어를 사용할때 저 흐름을 좀더

  빨라지도록 수정할 수 있을까? 라는 궁금증이 생겼다.

 

- static메모리,기본형변수의 메모리 내부의 값들이

  주소는 그대로인 상태에서 값만 변한다고 유추하고 있었는데그 과정이 어떻게 진행되는지 깨닫게 되었다.

 

 

 

 

 

'C > 기타' 카테고리의 다른 글

컴파일러와 링커가 하는일  (0) 2021.09.10
포인터 설명할것들 ( 수정예정 )  (0) 2021.08.31