AAPCS: 레지스터 사용

AAPCS(Procedure Call Standard for Arm Architecture) 기본 프로시저 호출 표준은 Arm 명령어 집합에 공통인 기계 수준의 코어 레지스터만 사용하는 호출 표준을 정의한다.

머신 레지스터(Machine Registers)

Arm 아키텍처는 핵심 명령어 세트와 co-processor에 의해 구현되는 여러 추가 명령어를 정의한다. 코어 명령어 세트는 코어 레지스터에 액세스 할 수 있으며, co-processor는 특정 작업을 사용할 수 있는 추가 레지스터를 제공할 수 있다.

코어 레지스터(Core Registers)

Arm 명령어 세트에 표시되는 16개(r0~r15)의 32비트 코어(정수) 레지스터가 있다. 레지스터가 PCS(Procedure Call Standard)에서 고정된 역할을 가질 때 대문자를 사용한다. 코어 레지스터 외에도 상태 레지스터(CPSR)도 존재한다. 다음 표는 코어 레지스터의 용도를 요약한 것이다.

RegisterSynonymSpecialRole in the procedure call standard
r15 PCThe Program Counter.
r14 LRThe Link Register.
r13 SPThe Stack Pointer.
r12 IPThe Intra-Procedure-call scratch register.
r11v8FPFrame Pointer or Variable-register 8.
r10v7 Variable-register 7.
r9v6SB
TR
Platform register or Variable-register 6.
The meaning of this register is defined by the platform standard.
r8v5 Variable-register 5.
r7v4 Variable-register 4.
r6v3 Variable-register 3.
r5v2 Variable-register 2.
r4v1 Variable-register 1.
r3a4 Argument / scratch register 4.
r2a3 Argument / scratch register 3.
r1a2 Argument / result / scratch register 2.
r0a1 Argument / result / scratch register 1.
Core registers and AAPCS usage
  • r0~r3 (a1~a4) : 서브 루틴으로 인자 값을 전달하거나 함수에서 결과값을 반환하는데 사용된다.
  • r12 (IP) : 루틴과 호출하는 모든 서브 루틴 사이의 링커의 스크레치 레지스터로 사용될 수 있다.
  • r11 (FP) : 프레임 포인터로 사용될 수 있다.
  • r9 (SB/TR) : 플랫폼에 따라 다른 역할을 한다. 정적 베이스(SB)로 지정하거나, 쓰레드 로컬 스토리지 환경에서 쓰레드 레지스터(TR)로 지정할 수 있다. 특별한 레지스터가 필요하지 않은 플랫폼에서는 callee-saved 변수 레지스터인 v6로 지정할 수 있다.
  • r4~r8, r10, r11(v1-v5, v7, v8): 로컬 변수값을 저장하는데 사용된다.
  • r13~r15(SP, LR, PC): 각각 특수한 역할을 수행한다.
    • r13(SP) : 스택 포인터로 사용된다.
    • r14(LR) : 링크드 레지스터로 사용된다.
    • r15(PC) : 프로그램 카운터로 사용된다.

CPSR 은 전역 레지스터로 다음과 같은 특성을 갖는다.

  • 상태 비트 필드 (N, Z, C, V) (31~28)
    • N (Negative) 비트: 연산 결과가 음수인 경우 1로 설정됩니다.
    • Z (Zero) 비트: 연산 결과가 0인 경우 1로 설정됩니다.
    • C (Carry) 비트: 연산 결과에서 발생한 캐리(자릿수 올림 또는 빌림)가 있는 경우 1로 설정됩니다.
    • V (Overflow) 비트: 연산 결과에서 발생한 오버플로우(값의 범위를 벗어남)가 있는 경우 1로 설정됩니다.
  • 예외 비트 필드 (E, A, I, F) (8~5)
    • E (Endian) 비트: 데이터 액세스의 엔디안 (바이트 순서)을 나타냅니다.
    • A (Asynchronous Abort) 비트: 비동기 예외(메모리 액세스 오류 등)가 발생한 경우 1로 설정됩니다.
    • I (IRQ Interrupt Disable) 비트: IRQ(일반적인 인터럽트)를 비활성화합니다.
    • F (FIQ Interrupt Disable) 비트: FIQ(고속 인터럽트)를 비활성화합니다.
  • 제어 비트 필드 (T, M) (5, 3~0)
    • T (Thumb Mode) 비트: 프로세서의 실행 모드를 Thumb 모드로 설정합니다.
    • M (Processor Mode) 비트: 프로세서의 실행 모드를 나타낸다.
  • 예약 비트 필드 (나머지)
    • CPSR에는 예약된 비트들이 있으며, 응용 프로그램에서 수정해서는 안 됩니다.

Co-processor 레지스터(Registers)

co-processor 명령어 공간의 명령어 를 통해 액세스되는 추가 레지스터로 확장될 수 있다. 이러한 레지스터가 서브 루틴 호출과 인수를 전달하는 데 사용되지 않는 한 co-processor 레지스터의 사용은 기본 표준과 호환된다. 각 co-processor는 해당 레지스터의 사용을 제어하는 추가 규칙 집합을 제공 할 수 있다.

참고

AAPCS 소개
AAPCS와 EABI의 관계
AAPCS: 데이터 타입과 정렬
AAPCS: 레지스터 사용
AAPCS: 프로세스 메모리 및 스택
AAPCS: Subroutine Calls(서브루틴 호출)

답글 남기기