강좌 & 팁
안녕하세요.
오늘은 저번에 약속한 대로!
CPSR 레지스터에 대하여 공부해 보겠습니다.
이 레지스터를 공부하는 이유는!!
ARM 명령어를 공부하다 보면 자주 보이는 레지스터이기 때문 입니다
자주 보이는 것은..
중요하다는 말이겠죠~?
CPSR 레지스터
CPSR 레지스터는 어떤 기능을 하는 레지스터 일까요~?
음.. 먼저!
CPSR 레지스터를 풀어쓰면
Current Program Status Register
이라고 합니다.
무슨 뜻일까요?
한국말로 번역하면
현재 프로그램 상태 레지스터..
쯤으로 해석 가능한가요~?ㅎ
해석을 토대로 CPSR 명령의 정의를 내리면!
"CPSR 레지스터는 현재 프로그램의 상태를 저장하고 있는 레지스터다!"
라고 정의를 할수 있겠죠?
좀더 유식하게 표현하자면 이렇게 말할 수 있습니다.
ARM 코어는 내부 동작을 모니터링하고 제어하기 위해 CPSR 레지스터를 사용한다.
어떤가요? 유식해 보이나요~?
후후.. 책에 적혀있는 말입니다
CPSR이 무엇인지 감을 잡으셨을테니!
어떻게 생긴 레지스터인가 살펴보겠습니다.
CPSR 레지스터의 레이아웃
CPSR의 레이아웃은 32비트를 기준으로 8 비트씩,
플래그(Flag) 비트, 상태(Status) 비트, 확장(Extension)비트, 제어(Control)비트
네 영역으로 나누어 집니다.
8 비트 * 4(4개의 레이아웃) = 32 비트 맞죠?
이를 그림으로 표현하면 다음과 같습니다.
31비트에서 24까지는 플래그(Flag) 비트,
23비트에서 16까지는 상태(Status) 비트,
15비트에서 8까지는 확장(Extension)비트,
7비트에서 0 비트까지는 제어(Control)비트
가 되겠습니다.
각각의 필드마다 의미하는 것들이 있습니다.
필드마다 어떤 기능이 있는지 표로 표현해 보겠습니다.
필 드 |
의 미 |
N | 음수(Negative)플래그, 플래그 설정 연산 결과를 31 비트에 기록한다. |
Z | 제로 (Zero) 플래그, 플래그 설정 연산 결과가 0인 경우에 기록한다. |
C | 캐리 (Carry) 플래그, 덧셈에 대한 unsigned overflow를, 뺄셈에 대한 not-borrow를 기록한다. 쉬퍼트 회로에 의해서도 사용된다. |
V | 오버플로우(Overflow) 플래그, 플래그 설정 연산에 대해 signed overlfow를 기록한다. |
Q | 포화(Saturation) 플래그, 포화시에 일부 명령어가 이 플래그를 1로 설정한다. |
J | J = 1은 자바 실행이 가능함을 의미한다.( 이때 T = 0 이어야 함) 이 비트를 변경하기 위해서는 BXJ 명령어를 사용한다. ( ARMv5E 이상 ) |
Res | 이 비트들은 확장을 위해 예약되어 있다. 소프트웨어는 이 비트들에 저장되어 있는 값을 유지해야함 |
GE[3:0] | SIMD greater-or-equal 플래그 |
E | 데이터 엔디안값을 제어한다. |
A | A = 1은 블확실한 data abort를 비활성화 한다. |
I | I = 1 은 IRQ 인터럽트를 비활성화 한다. |
F | F = 1 은 FIQ 인터럽트를 비활성화 한다. |
T | T = 1은 Thumb 상태를 가리키고, T = 0은 ARM 상태를 가리킨다. 이 비트를 변경하기 위해서는 BX 또는 BLX 명령을 사용해야 한다. |
Mode | 현재 프로세서 모드 |
CPSR 필드의 내용을 정말 어렵습니다
하지만 외우지 않으셔도 좋습니다.
어디있는지 위치를 잘 기억해 놨다가.
프로그램을 하실때 마다 찾아보시면 됩니다
앞으로?
다음 글에는 ARM 명령어중 하나를 선택하여 프로그램해 보겠습니다.