ARM은 16bit를 지원하기 위해 두 가지 모드로 나눈다.
32bit의 arm 모드와 16bit의 Thumb 모드가 있다. 두 가지 모드를 실행 중에 번갈아 가면서 사용할 수 있다.
이름 | 역할 |
---|---|
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 임베디드 강의
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
모드의 레지스터를 공유하게 된다. 그러나 공유하는 레지스터는 모드 변경 시 기존 모드의 레지스터 값을 스택에 넣어 현재 컨텍스트를 저장한다.