ARM Register와 Context

유명현·2024년 6월 16일

ARM core는 아래의 Register fileㅇ ㄹ 가지거 있고, ARM core는 동작 mode가 바뀌면 사용하는 Register set도 바뀐다.

그리과 같이 7개의 동작 mode에 대하여 레지스터 set이 따로 존재하며, ARM core는 32bit register를 한 mode당 R0 ~ R15까지 16개하고, CPSR + SPSR까지 더해서 18개씩 가지고 있다.

ARM core는 총 37개의 Register를 가진다.

위에 삼각형으로 그려진 register들은 banked register라고 부르며 그것들만이 각 mode별로 따로 있고 나머지는 mode 마다 모두 공용으로 사용한다.

그리므로, 총 R0 ~ R15 (16게) + CPSR(1개) + FIQ의 R8 ~ R14, SPSR (8개) + SVC의 R15, R14, SPSR(3개) + Abort의 R13, R14 + SPSR (3개) + IRQ의 R13, R14, SPSR (3개) + UND의 R13, R15, SPSR (3개) = 16 + 1 + 8 + 3 + 3 + 3 + 3 = 37개 입니다.

정리하면, 모든 mode가 공유하는 Register는 CPSR, PC, R0 ~ R7까지는 모두가 공유한다.

CPSR은 Current Program Status Register의 약자입니다.

위에 같이 32bit REgister 이며 해당 비트는 아래와 같다.

1) N(Negarive) : 연산결과가 마이너스인 경우에 set

2) Z(Zero) : 연산결과가 0인 경우에 set

3) C(Carry) : 연산결과에 자리 올림이 발생한 경우 set

4) V(oVEr flow) : 연산의 결과가 overflow 났을 경우에 set

IF : interrupt가 걸리지 않도록 Control 가능

T : ARM / Trumb mode 구분 Flag

Mode : 현재의 mode 표시 입니다.

SPSR (Saved Program Status Register)는 CPSR을 복사해 넣는 특수 Register이다.

SPSR은 CPSR의 값을 backup해 놓고 mode를 바꾸게 되었을 때, SPSR의 값을 CPSR에 다시 집어 넣으며 이전 MODE로 복귀가 가능하다.

R14 (Linked Register)는 branch 할 때 어디서 branch 해 왔는지를 표시한다.

R13 (Stack Pointer)는 현재 Stack을 어디까지 쌓아 두었는지를 가르킨다.

R15 (Program Counter)는 현재 어디를 수행하고 있는 건지를 나타내는 Register - 실행하는 위치가 아닌 Fetch해 온 위치를 가르킨다.

나머지 R0 ~ R12는 CPU의 동작중의 저장용도로 적절히 사용된다.
그래서 R0 ~ R12는 적당히 Register라고 부르고 R13 ~ 15, CPSR, SPSR은 특별한 용도가 있다고 해서 Special Purpose Regiser라고 구분한다.

*R0 ~ R12는 색상이 다른 이유?
Trumb mode는 R0 ~ R7만 쓰고, ARM mode는 R0 ~ R12까지 모두 사용한다.

*FIQ는 banked register가 많은 이유?
stack에 register backup을 하나라도 덜 하면 시간 절약이 된다.
그런 이유에서 FAST IRQ mode로의 전환은 더욱 빠르게 되어야 하니까, 전용 register를 하나라도 더 둔것 입니다.

출저: 임베디드 레시피

profile
기억보다 기록을

0개의 댓글