작업과 프로그램을 효율적으로 실행하는 데 사용할 수 있는 빠른 메모리. 4대 메모리 중에 가장 ALU와 근접하여 속도가 빠르고, 사용 용량이 가장 작다.

레지스터의 역할은 버퍼(내가 이해하기론)와 비슷한 역할을 가지고 있다.

ALU와 컨트롤 유닛이 연산할 값(will) 혹은 연산한 값(end) 등을 저장하는 역할.


Register Set

레지스터는 보통 CPU 1개 당 1개의 레지스터를 가진 것처럼 대응되는 것이 아닌, CPU 1개에 레지스터들(register set)을 가지게 된다.

따라서 이 레지스터의 구성에 따라 CPU의 명령어 구조 또한 달라지게 된다.

레지스터 셋은

  1. 다음에 실행될 명령어를 저장하는 용도
  2. 연산이 결과를 저장하는 용도
  3. 메모리에서 데이터를 가지고 오는 용도 (LOAD)
  4. 레지스터의 값을 메모리에 저장하는 용도(STORE)

외에도 여러가지 구성으로 존재한다.

레지스터에서 명령어를 저장하는 역할을 하는 레지스터를 R1이라고 해보자. R1에는 (명령어) (피연산자 값) (연산자 값) (저장 공간) 을 표현하게 될 수 있다 ex) 더하기, r2에 있는 값, r3에 있는 값, r7에 저장.

그런데, 레지스터가 메모리에 접근하게 될 때 (LOAD/STORE) 문제가 발생할 수 있다. 왜냐하면 레지스터의 비트는 당연하게 메모리의 총 공간보다 적기 때문에, 메모리의 주소를 저장하는 비트가 메모리의 모든 공간을 다 표현할 수는 없기 때문이다! (즉 레지스터에는 메모리의 공간을 지칭하는 비트가 8개 밖에 없는데, 메모리의 16진수로 표현되는 공간을 모두 표현하기 어렵다는 뜻)

Direct / Indirect 모드 위와 같은 문제를 해결하기 위해 이러한 개념이 제안이 되었다. (정확한 표현은 Direct Addressing / Indirect Addressing)

Direct모드는 주소값을 직접 명령어에 표현하는 방식이며, 위와 같이 메모리 비트 안에 표현하고자 하는 방식이다. 그렇기에 한계가 있고 이를 보완하기 위해 InDirect 모드가 제안이 되었다.

InDirect모드를 표현할 때에는 주소값에 []를 씌우게 되는데, 아래와 같은 방식으로 동작하게 된다.

  1. 아, 256번지에 있는 것을 가져와야 하는데, 주소는 8비트(255)로 밖에 표현이 안되네
  2. r0에 4*4의 값을 저장하라는 명령어를 보내자
  3. r1에도 4*4의 값을 저장하라는 명령어를 보내자
  4. r3에는 r0와 r1의 값을 곱해서 저장하라는 명령어를 보내자.
  5. r4는 주소를 참조할 때 r3에 있는 값을 참조해서 저장하라는 명령어를 보내자. 이런 방식이 진행되면 r3은 비로소 256번지라는 값을 아는 레지스터가 되며, 이후 연산에 r4는 r3에 저장된 값으로 접근하라는 명령을 보낼 수 있게 된다.