ARM Core - 2. ARM 아키텍처 및 내부 구조 (2. ARM 레지스터 구조)

2025. 3. 7. 13:15정보기술/하드웨어

2. ARM 레지스터 구조

ARM 프로세서의 레지스터 구조는 범용 레지스터(General-purpose Register)와 특수 레지스터(Special-purpose Register)로 구성되며, 프로그램 카운터(PC), 스택 포인터(SP), 링크 레지스터(LR), 상태 레지스터(CPSR)와 같은 핵심 레지스터들이 포함된다.

ARM 아키텍처는 RISC(Reduced Instruction Set Computing) 기반으로 설계되어 레지스터를 적극 활용하는 방식으로 동작한다. 이는 메모리 접근을 최소화하여 처리 속도를 향상시키는 데 중요한 역할을 한다.


1. 범용 레지스터 및 특수 레지스터

ARM 프로세서는 16개~32개의 레지스터를 지원하며, 각 레지스터는 32비트 또는 64비트 크기를 가진다(AArch64 모드에서는 64비트 확장 가능).

1) 범용 레지스터 (General-purpose Registers, GPR)

  • R0 ~ R12 (일반 범용 레지스터)
    • 데이터 저장, 산술 연산, 함수 인자 전달 등에 사용
    • 특정 레지스터는 특정 용도로 예약 가능 (예: R0은 함수 반환 값)
  • AArch64(64비트 모드)에서는 X0~X30 레지스터 사용
    • X0X30은 64비트 연산을 지원하며, 32비트 연산 시에는 W0W30으로 접근 가능

2) 특수 레지스터 (Special-purpose Registers)

특수 레지스터는 프로그램의 흐름을 제어하고, 인터럽트, 예외 처리, 상태 정보를 저장하는 역할을 한다.

레지스터  설명
프로그램 카운터(PC) 현재 실행 중인 명령어의 주소 저장
스택 포인터(SP) 함수 호출 및 스택 관리
링크 레지스터(LR) 함수 호출 후 복귀 주소 저장
상태 레지스터(CPSR/SPSR) 조건 플래그, 인터럽트 상태 저장

2. 프로그램 카운터(PC, Program Counter)

프로그램 카운터(PC)현재 실행 중인 명령어의 메모리 주소를 저장하는 레지스터로, 다음 실행할 명령어를 결정하는 역할을 한다.

1) 특징

  • PC 값은 항상 다음 명령어를 가리킴 (명령어 실행 후 자동 증가)
  • AArch32(32비트) 모드에서는 PC 값이 4씩 증가 (ARM 명령어가 4바이트 크기)
  • Thumb 모드(16비트 명령어)에서는 PC 값이 2 또는 4씩 증가
  • AArch64(64비트) 모드에서는 4바이트 명령어를 사용하며, PC가 항상 4씩 증가

2) 프로그램 흐름 제어

  • 분기(B), 조건 분기(BEQ, BNE), 함수 호출(BL) 명령어를 통해 PC 변경 가능
  • 예제 코드:
    MOV R0, #10    ; R0에 10 저장
    ADD R1, R0, #5 ; R1 = R0 + 5
    B label        ; label로 분기
    

3. 스택 포인터(SP, Stack Pointer)

스택 포인터(SP)함수 호출 시 로컬 변수 저장 및 복귀 주소를 관리하는 레지스터로, 스택 메모리(Stack Memory)를 관리하는 역할을 한다.

1) 특징

  • 스택은 일반적으로 "하향 확장(Downward Growing)" 방식 사용
    • 즉, 값이 추가될 때 SP가 감소하고, 제거될 때 SP가 증가
  • AArch64 모드에서도 SP 동작 방식은 동일하지만, 64비트 주소 공간을 사용
  • 함수 호출 시, LR과 지역 변수 저장

2) 스택 관리 예제

PUSH {R0, R1, LR} ; R0, R1, LR을 스택에 저장 (SP 감소)
POP {R0, R1, PC}  ; R0, R1, 복귀 주소(PC) 복원 (SP 증가)
  • PUSH → SP를 감소시키면서 데이터를 저장
  • POP → SP를 증가시키면서 데이터를 복원

4. 링크 레지스터(LR, Link Register)

링크 레지스터(LR)함수 호출 후 복귀할 주소를 저장하는 레지스터이다.

1) 특징

  • BL(Branch with Link) 명령어 사용 시, 현재 PC 값이 LR에 저장
  • BX LR 명령어를 실행하면 LR에 저장된 주소로 복귀

2) 함수 호출 및 복귀 예제

BL my_function  ; 함수 호출 (LR = 현재 PC + 4)
...
my_function:
    ; 함수 코드 실행
    BX LR       ; LR에 저장된 주소로 복귀
  • BL(Branch with Link) → LR에 반환 주소 저장 후 함수 호출
  • BX LR → LR에 저장된 주소로 복귀

5. 상태 레지스터(CPSR, Current Program Status Register)

CPSR(Current Program Status Register)프로세서의 상태 정보를 저장하는 레지스터로, 조건 플래그, 인터럽트 상태, 프로세서 모드 등을 포함한다.

1) 주요 역할

  • 조건 코드 플래그 (N, Z, C, V)
    • 연산 결과에 따라 N(음수), Z(영), C(캐리), V(오버플로우) 플래그 설정
  • 인터럽트 상태 (I, F 비트)
    • 인터럽트 활성화/비활성화 상태 저장
  • CPU 모드 설정
    • ARM은 여러 실행 모드를 지원 (User, Supervisor, IRQ, FIQ 등)

2) 상태 레지스터 비트 구성

비트 이름 설명
31 N (Negative) 연산 결과가 음수이면 1
30 Z (Zero) 연산 결과가 0이면 1
29 C (Carry) 연산 시 캐리가 발생하면 1
28 V (Overflow) 연산 결과가 오버플로우 발생하면 1

3) CPSR 값 확인 예제 (CMP 연산)

MOV R0, #5
MOV R1, #5
CMP R0, R1  ; R0 - R1 수행 (결과: 0 → Z 플래그 = 1)
BEQ equal   ; Z 플래그가 1이면 equal 레이블로 분기
  • CMP 명령어는 두 값을 비교(R0 - R1)하고 결과에 따라 플래그 설정
    • 같으면 Z = 1 (Zero 플래그 활성화)
    • 다르면 Z = 0

6. 레지스터 구조 요약

레지스터 설명
R0 ~ R12 일반 범용 레지스터
PC (Program Counter) 현재 실행 중인 명령어 주소
SP (Stack Pointer) 스택 메모리 관리
LR (Link Register) 함수 호출 후 복귀 주소 저장
CPSR (Current Program Status Register) 상태 플래그, 인터럽트 제어, CPU 모드

결론

ARM 프로세서의 레지스터 구조는 범용 레지스터(R0~R12)와 특수 레지스터(PC, SP, LR, CPSR)로 구성되며, 효율적인 연산, 함수 호출, 스택 관리, 프로그램 흐름 제어 등의 역할을 수행한다.

이러한 레지스터의 활용 방식은 메모리 접근을 최소화하고, 연산 속도를 극대화하는 RISC 아키텍처의 핵심 요소이다.