본문 바로가기

레지스터란 무엇인가?

CPU 내부에서는 여러 가지 장치 간에 수많은 작업이 고속으로 이루어지고 있습니다. 산술 연산의 경우 다음 계산의 진행을 위해 이전의 결과를 임시 보관해야 할 필요가 많을 것입니다. 또한 조건문을 처리하는 경우 조건 수식의 연산 결과에 대해 여러 가지 가능성을 두고 그에 따른 해당 작업이 미리 정해져 있으므로 이를 위해 그 결과를 각 단계 별로 보관할 필요도 있을 것입니다. 이와 같이 레지스터는 CPU에서 필요한 데이터를 임시 보관하는 역할을 하는 소비자들의 모임을 의미합니다.

 

레지스터는 전용 레지스터와 범용 레지스터로 구분할 수 있는데 전용은 CPU의 명령어 실행을 위해 제어 장치에 의해 사용되며, 범용은 일반적인 정보를 명령에 의해 지정하여 사용할 수 있습니다.

 

1. 범용 레지스터

GPR은 작업 레지스터 또는 스크래패치 패드 레지스터라고도 하며 연산 과정에서 필요하며 또한 고속이므로 많으면 많을수록 좋습니다. 이처럼 CPU가 자신의 작업을 위해 다목적으로 사용하는 레지스터를 범용 레지스터라고 합니다. 대부분 산술 논리 연산 장치와  연결하여 사용합니다. 일반적인 정보를 저장하며 보통 여러 개의 레지스터들로 구성됩니다. 이를 구별하기 위해서는 각각에 RISC 계열에서는 R0 ~ R3 또는 인텔 계열에서는 A ~ D와 같은 이름을 부여하여 사용하고 있습니다.

 

범용 레지스터의 가자 중요한 목적은 CPU 내에서 생성하는 데이터를 임시로 보관하는 것이지만 각 레지스터는 여기서 끝나지 않고 때로는 특별한 용도로 여러 가지 연산을 할 수 있도록 설계되어 있습니다. 따라서 누산기로서의 역할을 하거나 특정 주소 지정 방식에서 주소를 지정하는 목적으로 쓰이기도 합니다.

 

누산기는 범용 레지스터 중에서 가장 대표적인 것으로 증가, 감소, 이동, 데이터 변환 등 여러 가지 기능이 집약되어 있습니다. 누산기는 성능이 낮은 CPU에서 다른 레지스터들이 보관하는 기능밖에 갖고 있지 못할 경우 연산의 편의성을 위해 자주 쓰입니다. 예를 들면 1씩 증가시키는 연산을 산술연산 장치에서 수행한다면 가산기로 입력되어 연산하지만 누산기에 의해 처리할 경우 산술연산 장치보다 적어도 한 클락 빠르게 수행할 수 있고 명령어의 길이도 짧아진다는 이점이 있습니다.

 

2. 전용 레지스터

특수 레지스터라고도 하며 범용 레지스터에 의해 특별한 용도에 사용할 수 있습니다. 범용 레지스터가 성능 향상을 고려해 저장 용량이 정해지는 반면 전용 레지스터는 대부분 반드시 필요로 하는 용도로서 장착하고 있어야 합니다. 명령어 레지스터, 메모리 지정 레지스터, 스택 레지스터, 상태 레지스터 등이 있습니다.

 

1) 명령어 레지스터

메모리로부터 코드가 버스접속 장치를 통해 넘어오면 이것은 우선 프리페치 코드 큐에 쌓이고 명령어 해독기에 의해 하나씩 해석되어 명령어로 바뀌게 됩니다. 코드란 매크로 명령어로 보면 되고 명령어란 이것이 CPU 구조에 밀접하게 독자적인 형태로 바뀐 것을 말합니다. 즉, 마이크로 명령어를 의미합니다.

 

명령어 레지스터는 명령어를 수행하기 위해 잠시 정보를 보관하고 있는데 쓰입니다.  명령어가 적재되면 필요한 하드웨어를 구동하는 작업을 반복하여 명령어가 실행됩니다. 이 레지스터는 명령어를 보관하기 때문에 명령어와 그 형태가 동일합니다. 동작 코드에는 덧셈, 뺄셈, 분기 등의 동작 코드를 가지고 있고 피연산자는 주소 지정모드로 동작하며 피연산자는 해당 모드에 필요한 주소값을 가지고 있습니다. 따라서 동작 코드의 비트 개수에 의해 존재할 수 있는 명령어의 개수가 정해집니다.

 

2) 메모리 지정 레지스터

메모리 주소 레지스터, 인덱스 레지스터, 세그먼트 레지스터, 메모리 버퍼 레지스터, 프로그램 카운터 등이 있습니다.

① 메모리 주소 레지스터는 CPU가 기억 장치의 주소를 참조하는데 반드시 필요한 것으로 MAR 내에 존재하는 값은 CPU가 실질적으로 참조할 기억 장치의 주소를 나타내기 때문에 참조할 기어 장치의 주소를 유효 메모리 번지라고 부릅니다.

② 인덱스 레지스터는 내용과 명령어 레지스터에 있는 피연산자의 값을 더하여 여러 가지 주소 지정 모드를 만들어내며 이때 피연산자의 값은 변위의 역할을 합니다.

③ 세그먼트 레지스터란 메모리의 한 묶음으로 보통 64키로바이트의 크기를 갖습니다. CPU가 읽어야 할 코드나 또는 데이터가 있는 세그먼트가 기억 장치의 어느 위치에 있는지 가리킵니다. 엔텔 계열의 CPU에 있는 CS, DS, SS, ES 등은 코드나 데이터, 스택이 있는 세그먼트를 가리키는 기능을 갖습니다.

④ 메모리 버퍼 레지스터는 MAR의 상대적인 레지스터로 지정하는 주소에 있는 데이터가 MBR로 적재됩니다. 따라서 크기는 메모리에 지정된 워드의 크기와 같고 메모리 주소 레지스터의 크기는 주소 공간의 크기에 따라 가변적으로 설정할 수 있습니다.

⑤ SI 레지스터는 메모리 간에 대량의 데이터를 옮길 때 시작지와 목적지의 위치를 가리키는 용도로 쓰입니다. 이 레지스터들이 없다면 CPU는 각 지점에 대한 포인터 변수를 메모리에 설정하여 작업하여야 하는데 이 경우 주소 연산 과정에서 CPU와 메모리 간의 잦은 연산이 생기게 됩니다. 이는 메모리 간에 데이터를 옮기는 작업 시 시간이 많이 걸리기 때문에 오버헤드로 작용하게 됩니다.

⑥ 프로그램 카운터는 메모리 지정 레지스터의 일종으로 IP라고도 부릅니다. 이 레지스터는 CPU가 명령을 실행하기 위해 메모리를 참조하는 경우 가장 중요하게 다루어져야 할 레지스터이며 항상 프로그램에서 다음에 가져올 명령어의 주소를 가리킵니다. 보통 워드 개수 단위로 증가하지만 분기나 복귀 명령어를 실행하는 경우 컨트 값이 변할 수 있습니다. CPU는 다음의 명령어 실행 기간에 프로그램 카운터에 있는 값에 따라 해당 주소에서 명령어를 가져와서 명령어 레지스터에 적제 합니다. 이어서 명령어가 해석되어 바로 실행에 옮겨지는 것입니다. 따라서 프로그램 카운터가 엉뚱한 주소를 가리키면 CPU는 이상한 명령어를 실행할 것이며, 컴퓨팅 시스템이 루프 작업을 실행하거나 최악의 경우 시스템이 다운될 수 있습니다. 이 밖에 스택, 상태 레지스터가 있습니다.