ARM mode

ARM은 16bit를 지원하기 위해 두 가지 모드로 나눈다.

32bit의 arm 모드와 16bit의 Thumb 모드가 있다. 두 가지 모드를 실행 중에 번갈아 가면서 사용할 수 있다.

Register

이름 역할
r0 ~ r3 함수의 매개변수와 반환 값을 담는 레지스터, scratch 레지스터
r4 ~ r10 변수 레지스터
r11 Frame Pointer, x86-64에서의 rbp
r12 Intra Procedural Call
이름 역할
r13(SP) Stack Pointer, x86-64에서의 rsp
r14(LR) Link Register, return 주소 저장
r15(PC) Program Counter, x86-64에서의 rip
CPSR Current Program Status Register, 상태 레지스터

CPSR 레지스터

출처 : dreamhack 임베디드 강의

출처 : dreamhack 임베디드 강의

31비트부터 28비트까지는 Flag Field로 현재 상태를 나타냅니다. flag는 그림과 같이 NZCV가 존재하는데 각각

로 존재한다.

7비트에서 6비트에 있는 field는 IRQ와 FIQ를 비활성화 하는 비트로 1로 설정하게 되면 해당 인터럽트가 비활성화 된다

바로 뒤에 있는 T bit는 위에서 설명한 Arm과 Thumb 모드를 나타낸다. 0이 Arm, 1이 Thumb이다.

4에서 0비트는 현재 프로세스 모드를 나타내는데 각 비트별 모드 및 역할은

M[4:0] Mode 역할
0b10000 User 애플리케이션이 동작하는 모드, CPSR에서 flag field만 수정 가능
0b10001 Fast Interrupt Request (FIQ) 높은(fast) 우선순위 인터럽트 발생 시 진입
0b10010 Interrupt Request (IRQ) 낮은 우선순위 인터럽트 발생 시 진입
0b10011 Supervisor (SVC) 시스템 콜(SVC) 발생 시 진입
0b10111 Abort 메모리 접근 실패 시 진입
0b11011 Undefined 정의 되지 않은 명령어 확인 시 진입
0b11111 System User 모드의 Privileged 버전, CPSR의 모든 비트 수정 가능
(User 모드와 레지스터 공유)

과 같다. User 모드를 제외한 6개의 모드는 Privileged 모드로 스스로 설정할 수 있다. 각 모드는 각자의 Register set을 가지고 있습니다.

각각의 모드는 banked register를 가지고 있다. banked register는 각 모드 별로 물리적으로 존재하는 레지스터이며 banked register가 아닌 레지스터들은 User & System 모드의 레지스터를 공유하게 된다. 그러나 공유하는 레지스터는 모드 변경 시 기존 모드의 레지스터 값을 스택에 넣어 현재 컨텍스트를 저장한다.