프로세서 레지스터

[섬네일|400px|[레지스터 전송 수준 (RTL)으로 구현된 8비트 레지스터에 대한 상세 설명으로, 플립플롭을 사용하여 8비트 데이터를 저장하는 방법을 보여준다.]]

**프로세서 레지스터**(, 순화 용어: 기록기) 또는 단순히 **레지스터**는 컴퓨터의 프로세서에서 빠르게 접근할 수 있는 위치이다. 레지스터는 일반적으로 소량의 빠른 저장 공간으로 구성되지만, 일부 레지스터는 특정 하드웨어 기능을 가지며 읽기 전용 또는 쓰기 전용일 수 있다. 컴퓨터 구조에서 레지스터는 일반적으로 주기억장치와는 다른 메커니즘으로 주소 지정되지만, DEC PDP-10, ICT 1900 등과 같이 메모리 주소가 할당될 수도 있다.

로드-스토어 아키텍처 여부에 관계없이 거의 모든 컴퓨터는 더 큰 메모리에서 데이터를 레지스터로 로드한 다음, 해당 데이터를 산술, 비트 연산 및 기타 작업에 사용하며, 기계어 명령어를 통해 조작하거나 테스트한다. 조작된 항목은 동일한 명령어 또는 후속 명령어에 의해 종종 다시 주기억장치에 저장된다. 최신 프로세서는 주기억장치로 정적 또는 동적 RAM을 사용하며, 후자는 일반적으로 하나 이상의 캐시 레벨을 통해 접근된다.

프로세서 레지스터는 일반적으로 메모리 계층 구조의 최상단에 있으며, 데이터에 접근하는 가장 빠른 방법을 제공한다. 이 용어는 일반적으로 명령어 집합에 정의된 대로 명령어의 일부로 직접 인코딩된 레지스터 그룹만을 지칭한다. 그러나 최신 고성능 CPU는 레지스터 이름 변경을 통해 성능을 향상시키기 위해 이러한 "아키텍처 레지스터"의 복사본을 자주 보유하여 병렬 및 투기적 실행을 허용한다. 최신 X86 설계는 펜티엄 프로, 사이릭스 6x86, Nx586 및 AMD K5의 출시와 함께 1995년경에 이러한 기술을 도입했다.

컴퓨터 프로그램이 동일한 데이터에 반복적으로 접근하는 것을 참조 국부성이라고 한다. 자주 사용되는 값을 레지스터에 보관하는 것은 프로그램 성능에 매우 중요하다. 레지스터 할당은 컴파일러의 코드 생성 단계에서 수행되거나 어셈블리어 프로그래머에 의해 수동으로 수행된다.

## 크기
레지스터는 일반적으로 저장할 수 있는 비트 수로 측정된다. 예를 들어, 8비트 레지스터, 32비트 레지스터, 64비트 레지스터, 128비트 레지스터 등이 있다. 일부 명령어 집합에서는 레지스터가 다양한 모드에서 작동하여 저장 메모리를 더 작은 부분(예: 32비트를 4개의 8비트로)으로 분할하여 여러 데이터(벡터 또는 1차원 배열 데이터)를 동시에 로드하고 처리할 수 있다. 일반적으로 이는 메모리를 더 큰 레지스터에 매핑하는 추가 레지스터를 추가하여 구현된다. 여러 데이터에 대해 단일 명령어를 실행할 수 있는 프로세서를 벡터 프로세서라고 한다.

## 유형

프로세서에는 종종 여러 종류의 레지스터가 포함되어 있으며, 저장할 수 있는 값의 유형 또는 작동하는 명령어에 따라 분류할 수 있다.

* **사용자 접근 가능 레지스터**는 기계어 명령어로 읽거나 쓸 수 있다. 사용자 접근 가능 레지스터의 가장 일반적인 구분은 데이터 레지스터와 주소 레지스터로 구분하는 것이다.
** ***'는 [[데이터 (컴퓨팅)|숫자 데이터 값]] (예: [[정수형|정수]])과 일부 아키텍처에서는 [[부동소수점 수]], [[문자 (컴퓨팅)|문자]], 작은 [[비트 배열]] 및 기타 데이터를 저장할 수 있다. [[IBM 704]], [[IBM 709]] 및 후속 기종, [[PDP-1]], PDP-4/PDP-7/PDP-9/PDP-15, PDP-5/[[PDP-8]], [[HP 2100]]과 같은 일부 구형 아키텍처에서는 [[누산기]]로 알려진 특별한 데이터 레지스터가 많은 연산에 암시적으로 사용된다.
** ***'는 주소를 저장하며 주기억장치에 간접적으로 접근하는 명령어에 의해 사용된다.
*** 일부 프로세서에는 주소만 저장하거나 숫자 값만 저장하는 데 사용될 수 있는 레지스터(일부 경우에는 특정 주소에서 오프셋으로 값이 추가되는 인덱스 레지스터로 사용)가 포함되어 있다. 다른 프로세서는 레지스터가 두 종류의 양을 모두 저장할 수 있도록 허용한다. 피연산자의 유효 주소를 지정하는 데 사용되는 다양한 주소 지정 방식이 존재한다.
*** **[[콜 스택#스택과 프레임 포인터|스택 포인터와 프레임 포인터]]**는 콜 스택을 관리하는 데 사용된다. 드물게 다른 스택은 전용 주소 레지스터에 의해 주소 지정된다( 스택 머신 참조).
** **범용 레지스터** (general-purpose registers; s)는 데이터와 주소를 모두 저장할 수 있다. 즉, 데이터/주소 결합 레지스터이다. 일부 아키텍처에서는 레지스터 파일이 통합되어 GPR이 부동소수점 숫자도 저장할 수 있다.
** ***' (FPRs)는 많은 아키텍처에서 부동소수점 숫자를 저장한다.
** '''[[상수 (컴퓨터 프로그래밍)|상수]] 레지스터'''는 0, 1 또는 [[원주율]]과 같은 읽기 전용 값을 저장한다.
** ***'는 SIMD 명령어(단일 명령어, 다중 데이터)에 의해 수행되는 벡터 처리를 위한 데이터를 저장한다.
** **[[상태 레지스터]]**는 특정 명령어가 실행되어야 하는지 또는 실행되지 않아야 하는지를 결정하는 데 자주 사용되는 진릿값을 저장한다.
** **특수 목적 레지스터** (SPRs)는 프로그램 상태의 일부 요소를 저장한다. 여기에는 일반적으로 명령 포인터라고도 불리는 프로그램 카운터와 상태 레지스터가 포함된다. 프로그램 카운터와 상태 레지스터는 프로그램 상태 워드 (PSW) 레지스터로 결합될 수 있다. 앞서 언급된 스택 포인터도 때때로 이 그룹에 포함된다. 마이크로컨트롤러와 같은 임베디드 마이크로프로세서는 특수 하드웨어 요소에 해당하는 특수 기능 레지스터를 가질 수도 있다.
** **[[제어 레지스터]]**는 CPU와 같은 시스템 구성 요소의 동작을 설정하는 데 사용된다.
*** **[[모델별 레지스터]]** (기계별 레지스터라고도 함)는 프로세서 자체와 관련된 데이터 및 설정을 저장한다. 그 의미가 특정 프로세서의 설계에 연결되어 있으므로 프로세서 세대 간에 표준으로 유지될 것으로 예상되지 않는다.
*** **[[메모리 유형 범위 레지스터]]** (MTRRs)
* ****는 명령어로 접근할 수 없으며 프로세서 작업에 내부적으로 사용된다.
** **[[명령 레지스터]]**는 현재 실행 중인 명령어를 저장한다.
** RAM에서 정보를 가져오는 것과 관련된 레지스터, 즉 CPU와 별도의 칩에 위치한 저장 레지스터 모음:
*** **[[메모리 버퍼 레지스터]]** (MBR), 메모리 데이터 레지스터 (MDR)라고도 함
*** **[[기억 장치 주소 레지스터]]** (MAR)
* **아키텍처 레지스터**는 소프트웨어에 보이는 레지스터이며 아키텍처에 의해 정의된다. 레지스터 이름 변경이 기본 하드웨어에 의해 수행되는 경우 물리적 하드웨어와 일치하지 않을 수 있다.

**[[하드웨어 레지스터]]**는 비슷하지만 CPU 외부에 존재한다.

일부 아키텍처(예: SPARC 및 MIPS)에서는 정수 레지스터 파일의 첫 번째 또는 마지막 레지스터가 읽을 때 항상 0을 반환하도록 하드와이어되어 있는 의사 레지스터이다(주로 인덱싱 모드를 단순화하기 위함). 이 레지스터는 덮어쓸 수 없다. 알파에서도 부동소수점 레지스터 파일에 대해 동일한 방식으로 구현된다. 이로 인해 레지스터 파일은 실제로 사용 가능한 레지스터 수보다 하나 더 많은 레지스터를 가진 것으로 흔히 인용된다. 예를 들어, 31개의 레지스터만 위에서 정의한 레지스터 정의에 부합하더라도 32개의 레지스터가 있다고 인용된다.

## 예시
다음 표는 여러 주류 CPU 아키텍처의 레지스터 수를 보여준다. X86 호환 프로세서에서 스택 포인터(`ESP`)는 내용에 대해 사용할 수 있는 명령어 수가 제한적임에도 불구하고 정수 레지스터로 계산된다는 점에 유의해야 한다. 유사한 주의 사항은 대부분의 아키텍처에도 적용된다.

아래 나열된 아키텍처는 모두 다르지만, 거의 모두 헝가리계 미국인 수학자 존 폰 노이만이 처음 제안한 폰 노이만 구조로 알려진 기본 배열로 구성되어 있다. GPU의 레지스터 수가 CPU보다 훨씬 많다는 점도 주목할 만하다.

## 용법
프로세서에서 사용할 수 있는 레지스터 수와 이 레지스터를 사용하여 수행할 수 있는 연산은 최적화 컴파일러가 생성하는 코드의 효율성에 상당한 영향을 미친다. 표현식 트리의 스트라흘러 수는 해당 표현식 트리를 평가하는 데 필요한 최소 레지스터 수를 나타낸다.

## 같이 보기
* CPU 캐시
* 양자 레지스터
* 레지스터 할당
* 레지스터 파일
* 시프트 레지스터

## 각주

분류:컴퓨터 구조
분류:디지털 레지스터
분류:중앙 처리 장치