
레지스터는 CPU 내부의 작은 임시 저장 장치
프로그램 속 명령어 & 데이터는 실행 전후로 레지스터에 저장
CPU 내부에는 다양한 레지스터들이 있고, 각기 다른 역할을 가진다.
(반드시 알아야할 레지스터 종류)
컴퓨터에서 레지스터는 중앙 처리 장치(CPU) 내에 있는 작은 저장 공간으로, 가장 빠른 데이터 접근 속도를 제공합니다. 이러한 레지스터들은 다양한 용도로 사용되며, 각각의 레지스터는 특정한 역할을 가지고 있습니다. 몇 가지 주요 레지스터의 종류와 그 역할을 살펴보겠습니다:
범용 레지스터는 이름 그래도 다양하고 일반적인 상황에서 자유롭게 사용할 수 잇는 레지스터입니다. 일반적으로 MAR은 메모리 주소값만 MBR는 데이터버스로 주고 받을 값만 저장하지만 범용레지스터는 데이터와 주소를 모두 저장할 수 있습니다.
스택 포인터는 주로 스택(stack)이라 불리는 메모리 영역을 관리하는 데 사용됩니다. 스택은 함수 호출, 로컬 변수 저장, 프로그램 실행 중 발생하는 다양한 임시 데이터를 처리하는 데 사용되는 LIFO(Last In, First Out) 구조의 메모리 영역입니다.
스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식
스팩 포인터 : 스택의 꼭대기를 가르키는 레지스터

(https://velog.io/@kong2520/명령어의-구조#오퍼랜드-operand-주소-필드 를 보고 오면 좋다)

① PC에 저장된 주소를 MAR로 보낸다.
② MAR에 저장된 주소에 있는 기억장치의 명령어를 MBR로 읽어 오고, PC를 증가시킨다. 명령어의 실행을 위해 읽어 온 명령을 IR에 저장한다.
③ 명령어의 연산코드는 명령어 해독기로 보내고 오퍼랜드는 주소처리기로 보낸다.
④ 주소처리기는 MAR을 통해 기억장치에 접근하여 명령어 수행에 필요한 오퍼랜드의 주소 또는 다음 명령어의 주소를 계산한다.
⑤ 제어신호 발생기에서는 위의 ①~④ 과정에서 필요한 제어신호와 연산코드를 해독하여 명령 수행을 위한 제어신호를 발생시킨다. 이때 명령어가 기억장치의 주소를 참조하는 명령어라면 주소처리기를 동작시켜 다음에 수행될 명령어의 주소를 계산한다.
⑥ 현재 IR에 있는 명령어의 수행이 끝나면 증가된 PC의 내용은 다음에 수행할 명령어의 주소를 지정하거나 분기가 필요한 경우 해당 명령어의 주소를 지정하는데 이는 다시 ①부터의 과정을 반복하며 실행된다.
CPU 가 실행하고자 하는 프로그램이 메모리에 1000번지부터 1500번지까지 저장되어 있다.
이제 프로그램이 1000번지 , 즉 처음부터 실행한다고 가정하면





방금 예시에서 보았듯이 메모리 버퍼 레지스터에 메모리 주소 레지스터가 담고 있는 주소에 대한 명령어가 전달되면 PC(프로그램 카운터) 다음 실행할 메모리 주소로 (+1) 업데이트되었는데, 이 방법이 프로그램이 순차적으로 실행하는 원리가 된다.

물론 PC(프로그램 카운터)가 마냥 1 씩 증가하는 건 아니다.
프로그램의 순차적인 실행 흐름이 끊기는 경우도 있는데
Base Register "변위 주소 지정 방식" 이라는 특별한 주소 지정 방식에서 사용된다.
변위 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 특정 레지스터(프로그램 카운터,
베이스 레지스터)의 값을 더하여 유효 주소 얻기

오퍼랜드 필드 값(변위)와 레지스터 값을 더하면 유효주소를 얻어낼 수 있음.
그리고 연산코드로 그 유효 주소에 연산을 수행함

변위 주소 방식을 비교하기 위해 상대 주소 지정 방식도 배워보자
상대 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 프로그램 카운터(PC)의 값을 더하여 유효 주소 얻기

그림 설명 :
PC(프로그램 카운터)는 다음으로 읽어드릴 명령어 주소를 가지고 담고 있다.
여기서 3은 변위라고 볼수 있다.
즉 PC + 3 을 하면 다음으로 실행할 명령어 + 3번지, 즉 유효주소를 변위 + PC 로 얻을 수 있다.
베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더하여 유효 주소 얻기

그림 설명 :
기준주소는 프로그램의 시작점이라고 생각하면 된다.