본문 바로가기

Programming/Linux_Kernel

CPSR

원문 : http://forum.falinux.com/zbxe/index.php?document_srl=575677&mid=lecture_tip

arm register 그림 : http://recipes.egloos.com/4986854


오늘은 ARM register 중 하나인 cpsr 에 대해서 좋은 글이 있어서, 필요한 내용을 복사해 왔습니다.

이것 외에도 ARM 에 대해서 좋은 강좌가 많은 블로그 이니, 한번씩 들려보세요.





CPSR (Current Program Status Register)


프로그램의 상태를 저장하는 레지스터


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

  현재 프로세서 모드


각 arm mode 가 변경될때 CPSR 의 내용을 SPSR 로 복사해서 저장해 놓는다.