이 글은 직접 학습하거나 구현하며 남긴 개인 기술 기록입니다. 참고 자료가 있는 경우 본문에 출처를 남기고, 틀린 부분을 발견하면 수정합니다.
레지스터는 CPU가 명령을 실행할 때 피연산자·주소·상태를 보관하는 작은 저장 공간이다. 캐시나 RAM보다 CPU의 실행 장치 가까이에 있지만 접근 시간이 0인 것은 아니다. 명령 지연시간과 처리량은 레지스터뿐 아니라 파이프라인, 실행 유닛, 데이터 의존성, 캐시와 분기 예측 등의 영향을 함께 받는다.

프로그램에 보이는 레지스터와 CPU 내부 레지스터
레지스터를 설명할 때는 두 층을 구분해야 한다.
- 아키텍처 레지스터(architectural register): 명령어 집합(ISA)이 프로그램에 공개하는 범용·부동소수점·상태 레지스터
- 물리 레지스터(physical register): 비순차 실행과 레지스터 리네이밍 등을 위해 CPU 구현 내부에서 사용하는 저장 공간
두 집합은 일대일로 대응하지 않을 수 있다. 프로그램은 ISA가 정의한 결과만 관찰하며, 내부 물리 레지스터의 수와 배치는 프로세서 구현마다 다르다.
“연산 전에 모든 데이터가 반드시 레지스터를 거친다”는 말도 범위를 한정해야 한다. RISC-V나 AArch64 같은 load-store ISA에서는 메모리 값을 레지스터로 불러온 뒤 산술 연산을 하고 결과를 다시 저장한다. 예를 들어 다음 RISC-V 명령은 메모리 값을 읽어 더한 뒤 결과를 저장한다.
lw x5, 0(x10) # x10이 가리키는 메모리에서 32비트 값을 x5로 load
add x6, x5, x7 # x5와 x7을 더해 x6에 저장
sw x6, 0(x11) # x6 값을 x11이 가리키는 메모리에 store
반면 x86은 일부 명령에서 메모리 피연산자를 허용한다. 실제 실행 과정에서 어떤 내부 버퍼와 물리 레지스터를 사용하는지는 마이크로아키텍처의 구현 세부사항이다. 따라서 특정 교육용 데이터패스의 규칙을 모든 ISA의 공통 규칙으로 일반화하면 안 된다.
레지스터 폭은 모두 같지 않다
“레지스터는 보통 32비트 또는 64비트”라는 설명은 범용 정수 레지스터에 한정하면 대체로 이해하기 쉽지만, CPU의 모든 레지스터를 설명하지는 못한다.
예를 들어 AArch64는 31개의 범용 레지스터를 64비트 X0~X30 또는 같은 레지스터의 하위 32비트인 W0~W30으로 사용할 수 있다.
ADD W0, W1, W2 // 32비트 정수 덧셈
ADD X0, X1, X2 // 64비트 정수 덧셈
별도의 부동소수점·벡터 레지스터는 128비트로 사용할 수 있다. x86 계열에도 범용 레지스터 외에 더 넓은 SIMD 레지스터와 상태·제어 레지스터가 있다. 레지스터의 폭은 그 레지스터가 표현하는 데이터와 ISA가 정의한 연산에 따라 달라진다.
아키텍처 레지스터가 많으면 컴파일러가 중간값을 메모리로 잠시 내보내는 register spill을 줄일 가능성이 있다. 하지만 레지스터 수나 폭이 커졌다는 사실만으로 CPU 전체가 자동으로 빨라지는 것은 아니다.
교육용 레지스터 이름과 현대 CPU를 구분하기
AR, DR, AC, IR 같은 이름은 데이터패스를 설명하기 좋은 교육용 명칭이다. 모든 현대 CPU가 이 이름의 독립된 레지스터를 프로그램에 공개하는 것은 아니다.
| 교육용 이름 | 의미 | 주의할 점 |
|---|---|---|
| PC | 다음에 가져올 명령어 주소 | 순차 실행에서는 진행하지만 분기·점프·예외가 값을 바꿀 수 있음 |
| IR | 현재 해석할 명령어 | 현대 파이프라인에서는 하나의 공개된 IR 대신 여러 내부 단계에 명령이 존재할 수 있음 |
| AR | 메모리 접근 주소 | 실제 CPU에서는 주소 생성 장치와 load/store 파이프라인이 역할을 나눌 수 있음 |
| DR | 메모리와 주고받는 데이터 | 특정 교육용 데이터패스의 이름이며 보편적인 ISA 레지스터 이름은 아님 |
| AC | 산술 결과를 누적하는 누산기 | 범용 레지스터 ISA에는 별도 AC가 없을 수 있음 |
Morris Mano Basic Computer: 16비트 워드와 12비트 주소
컴퓨터구조 수업에서 사용하는 Morris Mano의 Basic Computer는 실제 상용 CPU의 사양이 아니라 명령어 사이클과 제어 신호를 설명하기 위한 교육용 모델이다. 이 모델은 4096×16 메모리, 즉 4096개의 16비트 워드를 사용한다.
| 레지스터 | 비트 수 | 역할 |
|---|---|---|
| AR | 12비트 | 메모리 주소 |
| PC | 12비트 | 다음 명령어 주소 |
| DR | 16비트 | 메모리에서 읽거나 쓸 데이터 |
| AC | 16비트 | 누산기 |
| IR | 16비트 | 현재 명령어 |
| TR | 16비트 | 임시 데이터 |
| INPR | 8비트 | 입력 문자 |
| OUTR | 8비트 | 출력 문자 |
왜 주소 레지스터는 12비트인가
4096개의 워드를 구분하려면 다음과 같이 12비트가 필요하다.
4096 = 2¹²
주소 범위 = 0 ~ 4095
따라서 주소를 담는 AR과 PC는 12비트면 충분하다. 반면 메모리 한 워드와 명령어는 16비트이므로 DR, AC, IR, TR은 16비트다.
전체 저장량도 단위를 구분해 계산할 수 있다.
4096 words × 16 bits/word
= 65,536 bits
= 8,192 bytes
= 8 KiB
이 모델은 워드 주소 방식이므로 주소 하나가 16비트 워드 하나를 가리킨다. 12비트 주소라고 해서 저장량이 4096바이트인 것은 아니다.
16비트 명령어 안의 12비트 주소
Basic Computer의 메모리 참조 명령은 16비트 IR을 다음처럼 나눈다.
1비트 간접 주소 지정 | 3비트 opcode | 12비트 주소
1 + 3 + 12 = 16이므로 한 워드 안에 연산 종류와 4096개 메모리 위치 중 하나를 가리키는 주소를 함께 넣을 수 있다. 이 예는 데이터 레지스터의 폭과 주소 레지스터의 폭이 반드시 같을 필요가 없는 이유를 보여준다.
핵심 정리
- 아키텍처 레지스터와 CPU 내부의 물리 레지스터는 서로 다른 층의 개념이다.
- load-store ISA는 메모리와 레지스터 사이의 이동을 명시적으로 구분하지만, 모든 ISA가 같은 피연산자 규칙을 갖는 것은 아니다.
- 범용 정수·벡터·상태·주소 레지스터는 목적에 따라 폭이 다를 수 있다.
- Mano의
AR,DR,AC,IR은 교육용 모델의 이름이며 현대 CPU의 공통 고정 목록이 아니다. 4096×16워드 메모리에는 12비트 주소와 16비트 데이터 경로가 필요하며 총 저장량은 8KiB다.
관련 글
참고 자료
- Arm: Registers in AArch64
- RISC-V Ratified Specifications: RV32I Base Integer Instruction Set
- Intel 64 and IA-32 Architectures Software Developer Manuals
- M. Morris Mano, Computer System Architecture, 3rd ed., “Basic Computer Organization and Design”
댓글이 보이지 않으면 GitHub에 로그인한 뒤 새로고침해 주세요. 공개 댓글은 로그인 상태에서 더 안정적으로 표시됩니다.