프로세서 레지스터
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
프로세서 레지스터는 프로세서 내부에 위치하며, 데이터를 저장하고 처리하는 데 사용되는 소형 저장 공간이다. 레지스터는 용도에 따라 데이터 레지스터, 주소 레지스터, 범용 레지스터, 부동소수점 레지스터, 특수 레지스터 등으로 분류되며, 프로그램의 실행 속도와 효율성에 큰 영향을 미친다. 다양한 CPU 아키텍처는 각기 다른 수와 종류의 레지스터를 사용하며, 레지스터의 크기는 비트 단위로 측정된다. 레지스터 할당은 컴파일러 최적화의 중요한 주제이며, 프로그래밍 언어의 호출 규약과 밀접하게 관련되어 있다. 한국의 임베디드 시스템, 슈퍼컴퓨터, 게임 산업 등 IT 환경에서도 프로세서 레지스터는 중요한 역할을 수행한다.
더 읽어볼만한 페이지
- 디지털 레지스터 - 명령 레지스터
- 디지털 레지스터 - 시프트 레지스터
시프트 레지스터는 클럭 신호에 따라 데이터를 순차적으로 이동시키는 디지털 회로로, 입출력 방식에 따라 다양한 종류가 있으며, 데이터 변환, 지연 회로, 펄스 폭 확장, 스택 구현, I/O 핀 확장 등 다양한 용도로 활용된다. - 컴퓨터 구조 - PA-RISC
PA-RISC는 휴렛 팩커드에서 개발한 RISC 기반 명령어 집합 아키텍처로, HP 서버 및 워크스테이션에 사용되었으며 대용량 L1 캐시와 SIMD 명령어 확장 등의 특징을 가졌으나 아이테니엄 아키텍처로의 전환으로 단종되었다. - 컴퓨터 구조 - 메모리 관리
메모리 관리는 운영체제의 핵심 기능으로, 여러 프로세스의 원활한 실행을 위해 메모리 공간을 할당하고 관리하며, 릴로케이션, 보호, 공유, 가상 메모리 관리, 자동/수동 메모리 관리 등의 기능을 수행한다. - 중앙 처리 장치 - 마이크로컨트롤러
마이크로컨트롤러는 프로세서, 메모리, 입출력 기능을 단일 칩에 통합하여 임베디드 시스템의 핵심이 되는 부품으로, 프로그램 내장 방식을 통해 소프트웨어만으로 제어 기능 변경이 가능하며, 현재는 32비트 ARM, MIPS 아키텍처 기반 제품이 주를 이루고, 저전력 소모, 소형화, 다양한 기능 통합을 특징으로 다양한 분야에서 활용된다. - 중앙 처리 장치 - NX 비트
NX 비트는 하드웨어 기반 보안 기능으로, 메모리 페이지의 실행 권한을 제어하여 특정 영역에서 코드 실행을 막아 버퍼 오버플로 공격과 같은 보안 위협을 줄이는 데 사용되며, AMD에서 처음 도입 후 다양한 프로세서와 운영체제에서 DEP 등의 이름으로 구현되었다.
2. 레지스터의 종류
레지스터는 용도와 기능에 따라 다양하게 분류된다. 일반적으로 다음과 같은 종류가 있다.
일부 프로세서에서는 주소 레지스터 대신 색인 레지스터를 사용하여 주소를 조작하기도 한다. 또한, 특정 아키텍처에서는 SPARC 및 MIPS와 같이 정수 레지스터 파일의 일부를 읽을 때 항상 0을 반환하는 '''의사 레지스터'''를 사용하기도 한다.
2. 1. 용도에 따른 분류
- '''데이터 레지스터''': 정수 값을 저장하는 데 사용된다.
- '''주소 레지스터''': 메모리 주소를 저장하며, 메모리 접근에 사용된다. 일부 프로세서에서는 주소 조작을 위해 '''색인 레지스터'''를 사용하기도 한다.
- '''범용 레지스터''' (GPR): 데이터와 주소를 모두 저장할 수 있다.
- '''부동소수점 레지스터''': 부동소수점 값을 저장하는 데 사용된다.
- '''상수 레지스터''': 0이나 1과 같이 고정된 값을 저장한다.
- '''특수 레지스터''': 프로그램의 상태를 저장하며, 프로그램 카운터, 스택 포인터, 상태 레지스터 등이 있다.
- '''명령 레지스터''': 현재 실행 중인 명령어를 저장한다.
- '''색인 레지스터''': 실행 중에 피연산자의 주소를 계산하는 데 사용된다.
2. 2. 특수 목적 레지스터
프로세서는 프로그램 상태의 일부 요소를 저장하는 특수 목적 레지스터(SPR)를 가지고 있다. 여기에는 일반적으로 다음이 포함된다.[1]- 프로그램 카운터(PC): 다음에 실행될 명령어의 주소를 저장한다. 명령어 포인터라고도 한다.[1]
- 상태 레지스터: 명령어 실행 여부를 결정하는 데 사용되는 참/거짓 값을 저장한다. 연산 결과로 발생한 자리 올림, 누산기가 0인 상태 또는 각종 프로세서의 상태를 보존한다.[1]
- 스택 포인터(SP): 런타임 스택을 관리하는 데 사용된다.[1]
프로그램 카운터와 상태 레지스터는 프로그램 상태 워드(PSW) 레지스터에 결합될 수 있다. 스택 포인터도 이 그룹에 포함되기도 한다.[1]
마이크로컨트롤러와 같은 임베디드 마이크로프로세서는 특수화된 하드웨어 요소에 해당하는 특수 기능 레지스터를 가질 수도 있다.[1]
페이징 방식이나 세그먼테이션 방식에서 페이지 선택자나 세그먼트 선택자로 사용하는 레지스터도 특수 목적 레지스터에 속한다.[1]
3. 레지스터의 구성
- 프로그램 계수기(PC): 다음에 실행할 명령어의 주소를 가지고 있다.
- 명령어 레지스터(IR): 현재 수행 중인 명령어를 가지고 있다.
- 메모리 주소 레지스터(MAR): 메모리로부터 읽어오거나 메모리에 쓰기 위한 주소를 가지고 있다.
- 메모리 버퍼 레지스터(MBR): 메모리로부터 읽어온 데이터 또는 메모리에 써야 할 데이터를 가지고 있다.
- 입출력 주소 레지스터(I/O AR): 입출력 장치에 따른 입출력 모듈의 주소를 가지고 있다.
- 입출력 버퍼 레지스터(I/O BR): 입출력 모듈과 프로세서 간의 데이터 교환을 위해 사용된다.
4. 레지스터의 크기
레지스터는 일반적으로 저장할 수 있는 비트 수로 측정되며, ''8비트 레지스터'', ''32비트 레지스터'', ''64비트 레지스터'', ''128비트 레지스터'' 등이 있다. 일부 명령어 집합 아키텍처에서는 레지스터가 다양한 모드로 작동하여 저장 메모리를 더 작은 부분으로 나누어 (예: 32비트를 8비트 4개로) 여러 데이터(벡터, 또는 데이터의 1차원 배열)를 동시에 로드하고 처리할 수 있는데, 이는 메모리를 더 큰 레지스터로 매핑하는 추가 레지스터를 추가하여 구현된다. 여러 데이터에 대해 단일 명령을 실행할 수 있는 프로세서를 벡터 프로세서라고 한다.
소프트웨어 자산의 유효 활용을 목적으로 16비트 프로세서의 명령어 집합을 그대로 동작시킬 수 있는 32비트 프로세서 등이 종종 개발된다. 이 경우 프로세서 내부 레지스터의 비트 길이는 커지지만(대개 2배로) 호환성을 유지하기 위해 이전 CPU의 명령어 코드로 동작할 때는 하위 비트만 사용한다.
인텔 8086 계열 CPU는 이처럼 확장되어 온 과정을 거친 대표적인 프로세서이다. 8080(인텔의 8비트 CPU)에서는 범용 레지스터를 "a", "b", "c"… 등으로 명명했다. 이를 확장한 8086의 범용 레지스터는 "ax", "bx", "cx"…가 되었다 (x는 extend의 약자). 80386에서 32비트로 확장되면서 레지스터 이름은 "eax", "ebx", "ecx"…가 되었다 (e도 extend의 약자). AMD가 AMD64에서 64비트로 확장했을 때는 레지스터 이름이 "rax", "rbx", "rcx"…가 되었다.
5. 다양한 CPU 아키텍처에서의 레지스터
다양한 CPU 아키텍처는 각기 다른 수와 종류의 레지스터를 사용한다. 다음 표는 여러 주류 CPU 아키텍처의 레지스터 수를 보여준다.
x86 호환 프로세서에서 스택 포인터(ESP)는 정수 레지스터로 간주되지만, 내용에 대해 작동하는 데 사용할 수 있는 명령어 수가 제한되어 있다. 대부분의 아키텍처에도 비슷한 주의 사항이 적용된다.
아래 나열된 모든 아키텍처는 서로 다르지만, 거의 모두 헝가리계 미국인 수학자 존 폰 노이만이 처음 제안한 폰 노이만 아키텍처로 알려진 기본 배열에 있다. 또한 GPU의 레지스터 수가 CPU의 레지스터 수보다 훨씬 많다는 점도 주목할 만하다.
6. 레지스터와 프로그래밍
프로그래밍 언어를 기계어로 변환할 때, 수식 평가 중간의 값 등은 메모리에 쓰지 않고 레지스터에 보관하여 계산하는 것이 효율적이다. 가능하다면 변수 자체도 레지스터에 할당하는 것이 더 효율적이다. 이러한 레지스터 운용 문제를 레지스터 할당이라고 하며, 컴파일러 최적화의 중요한 주제 중 하나이다.[42]
초기 C 언어 컴파일러는 최적화에 크게 신경 쓰지 않아, 프로그래머가 레지스터에 할당할 변수를 지정하는 키워드 `register`를 사용했다. 그러나 현재의 최적화 컴파일러는 `register` 지정을 무시한다. C++에서도 마찬가지였지만, C++11에서는 `register` 키워드가 권장되지 않았고, C++17에서는 삭제되었다(단, 예약어로 남았다).[42]
서브루틴과의 정보 교환(인수와 반환값)은 프로그램을 모듈로 분할하여 컴파일하기 위해 미리 정해두어야 하며, 이를 호출 규약이라고 한다. 호출 규약에는 여러 종류가 있지만, 레지스터가 많은 머신에서는 레지스터로 정보를 주고받는 것이 효율적이며, 이를 레지스터 전달이라고 한다. SPARC 등의 RISC 프로세서나 EPIC 아키텍처에는 아키텍처적으로 이를 지원하는 레지스터 윈도우가 있다. 레지스터 전달과 반대로 스택으로 전달하는 것을 스택 전달이라고 한다. 인수를 스택에 쌓아 서브루틴을 호출하지만, 반환값은 레지스터(누산기)로 반환하는 경우가 많다.
PC에서 널리 사용되는 x86의 경우(w:X86 calling conventions), IA-32 및 그 이전 프로세서에서는 컴파일러가 생성하는 코드에서 스택 전달이 많았지만, 최적화된 컴파일러에서는 Microsoft C의 `__fastcall` 구문으로 레지스터 전달을 명시하거나, 가능한 한 레지스터 전달을 하는 코드를 생성하는 LSI C-86도 있다. x64에는 Microsoft x64와 System V AMD64 두 종류가 있지만, 둘 다 레지스터 전달이 기본이다.
가변 인수를 레지스터로 전달하는 것은 어렵기 때문에, 가변 인수일 경우에는 스택 전달을 하는 경우도 많다.
7. 특수 아키텍처
레지스터 세트(Register set)는 빠른 컨텍스트 스위칭을 위해 여러 개의 레지스터 그룹을 사용하는 방식이다. 자일로그사의 CPU Z80은 이중 레지스터를 가지고 있어, 레지스터 세트를 사용한 컨텍스트 스위칭을 지원하는 대표적인 프로세서이다.[4] 최근 프로세서 중에서는 ARM이 레지스터 세트를 가지고 있다.[4] 이러한 방식은 처리 속도를 높일 수 있지만, 레지스터를 구성하는 회로가 복잡하여 프로세서에 많이 구현하기 어렵다는 단점이 있다.[4]
제로 레지스터(Zero register)는 읽을 때 항상 0을 반환하는 레지스터로, 명령 집합을 단순화하는 데 사용된다. MIPS는 R0 레지스터가 항상 0을 반환하는 제로 레지스터이다.[3] 제로 레지스터와 연산 명령을 조합하면 다른 명령과 동일한 처리를 수행할 수 있다.[3] 예를 들어, 덧셈 명령에서 A=B+Z (A, B는 범용 레지스터, Z는 제로 레지스터)를 실행하면 B의 값이 A에 들어가 B 레지스터에서 A 레지스터로 데이터를 전송하는 MOV 또는 LD 명령과 같아진다.[3]
8. 결론
프로세서 내부의 레지스터는 계산 결과를 일시적으로 저장하거나, 메인 메모리에 접근할 때의 주소를 보존하고, 프로세서 및 주변 기기의 동작 상태를 제어하는 역할을 한다. 프로세서의 동작은 프로그램 코드에 따라 메인 메모리와 레지스터 사이에서 데이터를 주고받는 것이라고 할 수 있다.[1]
프로세서 내부에는 보통 수 개에서 수십 개의 레지스터가 있으며, 내부 버스나 연산 회로 등과 밀접하게 연결되어 고속으로 동작한다.[1]
프로세서의 구조(아키텍처)와 명령 집합은 내부에 어떤 레지스터가 있는지와 밀접하게 관련된다.[1]
참조
[1]
웹사이트
What is a processor register?
https://www.educativ[...]
2022-08-12
[2]
웹사이트
A Survey of Techniques for Designing and Managing CPU Register File
https://www.research[...]
[3]
웹사이트
Cray-1 Computer System Hardware Reference Manual
http://www.bitsavers[...]
Cray Research
2022-12-23
[4]
웹사이트
MCS-4 Micro Computer Set Users Manual
https://bitsavers.co[...]
Intel
1973-02
[5]
웹사이트
8008 8 Bit Parallel Central Processor Unit Users Manual
http://bitsavers.inf[...]
Intel
2014-01-23
[6]
웹사이트
Intel 8080 Microcomputer Systems User's Manual
https://bitsavers.tr[...]
Intel
2014-01-23
[7]
웹사이트
80286 and 80287 Programmer's Reference Manual
https://bitsavers.tr[...]
Intel
[8]
웹사이트
Intel 64 and IA-32 Architectures Software Developer Manuals
http://www.intel.com[...]
Intel
2019-12-04
[9]
웹사이트
AMD64 Architecture Programmer's Manual Volume 1: Application Programming
https://www.amd.com/[...]
AMD
2013-10
[10]
웹사이트
Intel Architecture Instruction Set Extensions and Future Features Programming Reference
https://software.int[...]
Intel
2018-01
[11]
서적
F8, Preliminary Microprocessor User's Manual
https://datasheets.c[...]
Fairchild
1975-01
[12]
서적
F8 Guide to Programming
http://www.bitsavers[...]
Fairchild MOS Microcomputer Division
[13]
웹사이트
Nios II Classic Processor Reference Guide
https://www.altera.c[...]
Altera
2015-04-02
[14]
웹사이트
Nios II Gen2 Processor Reference Guide
https://www.altera.c[...]
Altera
2015-04-02
[15]
웹사이트
M6800 Programming Reference Manual
http://www.bitsavers[...]
Motorola
2015-05-18
[16]
웹사이트
Motorola M68000 Family Programmer's Reference Manual
https://www.nxp.com/[...]
Motorola
2024-11-10
[17]
웹사이트
CUDA C Programming Guide
https://docs.nvidia.[...]
Nvidia
2020-01-09
[18]
arXiv
Dissecting the NVIDIA Volta GPU Architecture via Microbenchmarking
[19]
서적
Control Data 6000 Series Computer Systems, Reference Manual
http://bitsavers.inf[...]
Control Data Corporation
1965-07
[20]
서적
IBM System/360 Principles of Operation
https://bitsavers.tr[...]
IBM
[21]
서적
IBM System/370, Principles of Operation
http://bitsavers.inf[...]
IBM
1975-09-01
[22]
서적
z/Architecture, Principles of Operation
https://www.ibm.com/[...]
IBM
2008
[23]
웹사이트
IBM Enterprise Systems Architecture/370 and System/370 - Vector Operations
http://bitsavers.org[...]
IBM
2020-05-11
[24]
웹사이트
IBM S/390 G5 Microprocessor
https://old.hotchips[...]
[25]
웹사이트
MMIX Home Page
http://mmix.cs.hm.ed[...]
[26]
웹사이트
Series 32000 Databook
http://bitsavers.org[...]
National Semiconductor
[27]
서적
Intel Itanium Architecture, Software Developer's Manual, Volume 3: Intel Itanium Instruction Set Reference
https://www.intel.co[...]
Intel
2010-05
[28]
서적
The SPARC Architecture Manual, Version 9
https://www.cs.utexa[...]
SPARC International, Inc.
[29]
서적
Power ISA Version 3.1B
https://wiki.raptorc[...]
OpenPOWER Foundation
2021-09-14
[30]
서적
Blackfin Processor, Programming Reference, Revision 2.2
https://www.analog.c[...]
Analog Devices
2013-02
[31]
웹사이트
Synergistic Processor Unit Instruction Set Architecture Version 1.2
https://www-01.ibm.c[...]
IBM
2007-01-27
[32]
서적
VAX Architecture, Reference Manual
https://bitsavers.tr[...]
DEC books
1987
[33]
서적
Alpha Architecture Reference Manual
https://download.maj[...]
Compaq Computer Corporation
2002-01
[34]
웹사이트
Learning 65816 Assembly
https://wiki.superfa[...]
2019-11-14
[35]
웹사이트
Procedure Call Standard for the ARM Architecture
http://infocenter.ar[...]
ARM Holdings
2013-05-27
[36]
웹사이트
2.6.2. The Thumb-state register set
https://developer.ar[...]
ARM Holdings
[37]
서적
Arm A64 Instruction Set Architecture, Armv8, for Armv8-A architecture profile
https://student.cs.u[...]
Arm
2021
[38]
서적
MIPS64 Architecture For Programmers, Volume II: The MIPS64 Instruction Set
https://www.ece.lsu.[...]
RISC-V Foundation
2001-03-12
[39]
서적
The RISC-V, Instruction Set Manual, Volume I: User-Level ISA, Document Version 2.2
https://riscv.org/wp[...]
RISC-V Foundation
2017-05
[40]
웹사이트
Epiphany Architecture Reference
http://adapteva.com/[...]
[41]
서적
bit 単語帳
共立出版
1990-08-15
[42]
웹사이트
非推奨だったregisterキーワードを削除 - cpprefjp C++日本語リファレンス
https://cpprefjp.git[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com