questionet

CS 기초, 레지스터 본문

Learning questions/기초 개념

CS 기초, 레지스터

orthanc 2024. 4. 9. 12:28

4장


ㅡㅡㅡㅡCPUㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
|                          
|  ---ALU---    레지스터           ALU : 계산
|  |       |    레지스터           제어장치 : 명령어를 읽고 해석
|  |       |    레지스터           레지스터 : 저장장치
|  ---------    레지스터     
|                            제어장치가 ALU에 수행할 연산을 담은 제어신호를 보내면
|  +제어장치+    레지스터          ALU는 레지스터와 메모리에서 필요한 데이터를 받아서 계산을 하고
|  +       +    레지스터          필요하면 플래그 레지스터에 플래그를 보내고
|  +       +    레지스터          계산 결과를 다시 레지스터 또는 메모리에 보낸다
|  +++++++++    레지스터
|
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



플래그 : 연산결과에 대한 추가 정보 (CPU가 프로그램 실행도중 반드시 기억해야 하는 추가정보)
플래그는 플래그 레지스터에 저장된다

종류 :
부호 플래그 1 연산결과가 음수
               0 연산결과가 양수
        제로 플래그 1 연산결과가 0
               0 연산결과가 0이 아님
        캐리 플래그 1 연산결과 올림수, 빌림수 발생
               0 발생하지 않음
        오버플로 플래그 1 연산결과가 연산결과를 담을 레지스터보다 큼
                   0 크지 않음
        인터럽트 플래그 1 인터럽트 가능
                   0 불가능
        슈퍼바이저 플래그 1 커널모드
                     0 사용자 모드
                  


제어장치가 받는 신호들
1. 클럭
2. 명령어 레지스터로부터 명령어 : CPU가 해석해야할 명령어들
3. 플래그 레지스터로부터 플래그 : ALU가 연산결과 내보낸 플래그
4. 제어버스로부터 제어신호 

제어장치가 내보내는 신호들
CPU 외부
제어버스로 메모리에 전달하는 제어신호 : 메모리에 저장된 값을 읽거나 메모리에 새로운 값을 쓰고 싶을 때
제어버스로 입출력장치에 전달하는 제어신호 : 입출력 장치의 값을 읽거나 입출력 장치에 새로운 값을 쓰고싶을 때
CPU 내부
ALU에 전달하는 제어신호 : ALU가 수행할 연산을 지시
레지스터에 전달하는 제어신호 : 레지스터간 데이터를 이동시키거나, 레지스터에 저장된 명령어를 해석하기 위한 제어신호



레지스터

프로그램 속 명령어 instruction, 데이터 data는 실행 전후로 반드시 레지스터에 저장된다

따라서 레지스터에 저장된 값을 잘 보면, CPU 내부에서 무슨 일이 벌어지는지 (프로그램 실행과정을) 알 수 있다.

대표적인 8가지 레지스터
1.프로그램 카운터
2.명령어 레지스터
3.메모리주소 레지스터
4.메모리버퍼 레지스터
5.플래그 레지스터
6.범용 레지스터
7.스택 포인터
8.베이스 레지스터


CPU가 프로그램을 실행할 때,
프로그램 카운터(Program Counter, PC)가 가리키는 메모리 위치에서 명령어를 가져와
명령어 레지스터에 로드합니다. 
그런 다음, CPU는 명령어 레지스터에 저장된 명령어를 해석하고 실행한다.
이 과정을 더 구체적으로 살펴보면

CPU가 실행할 프로그램(명령어, 데이터)이 메모리에 저장돼 있고   <<<<< 이 부분이 어떻게 가능해지는 건지 여기선 불명확
해당 메모리 주소가 프로그램 카운터에 저장된다.                <<<<< 이걸 누가 언제 어떻게 하는지도 여기선 불명확
 
1. 프로그램 카운터 Program Counter
명령어가 들어있는 메모리 주소를 저장
Instruction Pointer 명령어 포인터라고도 한다

프로그램 카운터에 저장된 메모리 주소를 읽기 위해
해당 주소를 주소버스를 통해 메모리에 보내야 한다.
이를 위해 해당 주소가 메모리주소 레지스터에 저장된다.

2.메모리주소 레지스터 Memory Address Register
메모리의 주소를 저장하는 레지스터
CPU가 읽어들이고자 하는 주소값을 주소버스로 보낼 때 메모리주소 레지스터를 거친다

메모리 읽기 제어 신호와 메모리주소 레지스터 값이 
각각 제어버스와 주소버스를 통해 메모리로 전달된다.

3.메모리버퍼 레지스터 Memory Buffer Register, Memory Data Register
메모리에 쓰고 싶은 값(데이터와 명령어)과
메모리로부터 전달받은 값(데이터와 명령어)을 저장하는 레지스터 
CPU가 데이터 버스로 주고받을  값은 메모리버퍼 레지스터를 거친다

데이터 버스를 통해 메모리버퍼 레지스터로 메모리에 저장된 값이 전달되면
프로그램 카운터는 증가되어 다음 명령어를 읽어들일 준비를 한다 
(이 과정이 반복되면서 CPU는 프로그램을 차례대로 실행해나간다. 그런데 이런 순차적인 실행흐름이 끊기는 경우가 있을 수 있다. 
명령어 중 JUMP, CONDITIONAL JUMP, CALL, RET 같은 특정 메모리 주소로 실행흐름을 이동하는 명령어가 실행되었을 때 그렇다. 
이 경우 PC에는 변경된 주소가 저장된다.
또한 인터럽트가 발생해도 프로그램의 순차적인 실행흐름이 끊어진다)
메모리 버퍼 레지스터에 저장된 값은 명령어 레지스터로 이동한다

4.명령어 레지스터 Instruction Register
메모리에서 읽어들인 명령어를 저장
제어장치는 명령어 레지스터의 명령어를 해석하고 제어신호를 발생시킨다



5.범용 레지스터
메모리버퍼 레지스터는 데이터 버스로 주고받을 값만 저장하고
메모리주소 레지스터는 주소 버스로 내보낼 주소값만 저장하지만
범용 레지스터는 데이터, 주소 모두 저장 가능

6.플래그 레지스터
ALU 연산결과에 따른 플래그를 저장

특정 레지스터를 이용한 주소지정 방식 addressing mode

프로그램 카운터, 스택 포인터, 베이스 레지스터는 주소지정에 사용될 수 있는 특별한 레지스터들이다.

1) 스택 주소 지정 방식 : 스택과 스택포인터 사용
7.스택 포인터
스택의 꼭대기를 가리키는 레지스터
스택 포인터는 스택의 맨 위에 있는 주소를 가리킨다.
여기서 스택은 메모리 안에 있다.
스택 영역 : 메모리 안 어딘가에 스택처럼 사용되는 영역

2) 변위 주소 지정 방식 : 프로그램 카운터와 베이스 레지스터 사용
연산코드 필드  레지스터 필드  오퍼랜드 필드
레지스터 필드에 프로그램 카운터나 베이스 레지스터 값이 들어가서 오퍼랜드 필드에 있는 값과 함께
메모리 상의 유효주소를 가리키는 방식

이러한 변위 주소 지정 방식은 두가지가 있다.
1) 상대 주소 지정 방식 relative addressing mode
명령어가 [연산코드 PC -3] 이라면 PC에 저장된 주소-3 값인 주소가 유효주소가 된다
if 문과 유사하게 분기하여 특정 주소의 명령어를 실행할 때 사용
2) 베이스 레지스터 주소 지정 방식
8.베이스 레지스터
명령어가 [연산코드 베이스 레지스터 50] 이고 베이스 레지스터에 200 이란 값이 있었다면
기준 주소 200 에서 50만큼 떨어진 250에 접근하라를 의미하게 된다

Comments