안녕하세요.


오늘은 저번에 약속한 대로!


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 비트 맞죠?


이를 그림으로 표현하면 다음과 같습니다.


cpsr.png


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 명령어중 하나를 선택하여 프로그램해 보겠습니다.