ARM의 레지스터는 r0부터 r15까지 총 16개의 user mode의 Register가 존재합니다. 거기에 system mode에서 사용하는 15개의 register와 각모드에 존재하는 CPSR, SPSR을 합쳐 총 37개의 레지스터가 존재 합니다.

 
<출처 : ARM Sysyem-On-chip Architecture>
 위 그림은 ARM Register를 그림으로 나타낸 것입니다. 일단 가장 왼쪽에 User Mode를 보면 하얀색으로 r0~r15(pc)와 CPSR이 있습니다. 일단 r0~r12까지는 일반적으로 cpu에서 load-store 명령어를 가지고 사용할 수 있는 Register들 입니다.
 그리고 r13부터가 조금 특이한 성격을 갖고 있는데 일단 r13은 SP(Stack Pointer)라고 불립니다. 이 스텍포인터는 다른 컴퓨터 구조와 마찬가지로 사용하는 프로그램의 메모리중 가장 위쪽(Top)을 가리킵니다.
 R14는 링크 레지스터로 예외처리(Excetpion Mode)를 하고 난 뒤 혹은 서브루틴 함수에서 다시 메인으로 돌아갈 주소를 저장하는 링크 주소를 저장하는 레지스터라고 생각하시면 도비니다.
 R15는 PC라고 불리는 Program Counter 입니다. 이 PC가 하는 역할은 실행할 프로그램을 잃어올 메모리의 위치를 가리킵니다. 따라서 PC는 user mode뿐만 아니라 system mode에서도 공유하여 사용합니다.

 위에 그림을 보면 의문점이 하나 생길 수 있습니다. 그것은 "위에 그림을 보니 FIQ라든가 SVC라든가 다른 system mode를 보면 register들이 usermode에 비해 현격히 적습니다. 특히 svc, abort, irq, undefined 같은 경우는 r13, 14. 두개의 register밖에 사용을 못하는겁니까?" 라고 물을 수 있습니다.
  결론을 먼저 말한다면 다행히도 아닙니다. 지금 위에 있는 것들은 유저모드의 레지스터와 '예외처리 및 에러처림의 전용레지스터'만 나타낸 것입니다. 따라서 어떤 모드 이던지 모든 모드에서 레지스터는 r0~r15+CPSR을 사용합니다. 그리고 전용레지스터가 아닌 레지스터는 공용(General)으로 사용합니다.
 다시말해서 일반 interrupt가 발생시 irq mode로 전환됩니다. 이때 사용되는 r0~r12까지는 user mode에서 사용하던 General register(범용레지스터)를 사용하게 됩니다. 물론 이 때 있던 값들은 메모리에 저장이 되어서  다시 되돌아갈 주소를 r14가 저장을 해주게 됩니다.

 그럼 이제 ARM register의 mode 들을 살펴보겠습니다.
 가장 일반적인 user mode는 일반적으로 응용프로그램들을 실행할때 사용됩니다. 이때 다른모드로 넘어가기 위해 svc(supervisor call)를 사용하여 넘어가게 됩니다.
 FiQ는 Fast IRQ로서 빠른 Interrupt 처리를 위해 만들어진 레지스터로써 ARM의 중요점인 interrupt처리를 위해 다른 예외처리보다 더 register를 설정해 두었습니다.
 IRQ는 일반적으로 사용되는 외부 Interrupt들을 처리하기 위해 만들어진 Register로서 대부분 하드웨어적인 입출력 장치들의 완료보고등을 처리한다고 보시면 됩니다.
 SVC는 Siperviser Call로서 일반 유저 모드가 아닌 다른 레지스터들. O/S에서의 커널이나 장치 드라이버등을 처리할때 작동됩니다. 이 Mode는 Reset신호가 입력이 되거나 SWI(software interrupt : 프로그래머의 임의적인 요청)가 발생하면 SVC모드로 넘어 갈 수 있습니다.
 Abort는 interrupt가 아닌 error처리모드로 데이터를 읽거나 쓸 때 오류가 발생할 경우 abort모드로 전환되어 처리됩니다.
 undefined는 처리하고자 하는 명령어가 ARM명령어가 아닌경우(디코더에 정의 되어있지 않은경우)에 발생하는 모드입니다.


그리고는 또 중요한 것이 각 모드마다 있는 CPSR(SPSR)이라는 Register입니다. 이 CPSR은 Current Program Statue Register의 약자로 즉, 현재의 프로그램 상태를 나타내 주는 레지스터 입니다.
 이 CPSR은 Condition Flag와 현재의 Mode를 나타내주는 값들이 들어 있습니다. 우선 중요한것은 Condition Flag인데 상위에 4bit(순서대로 N,Z,C,V)가 이것을 나타내 줍니다.

 N : Negative로 ALU operation의 결과가 음수인 경우 최상위 비트가 1로 Setting이 됩니다. 즉, CPSR의 최상위 비트가 1이 됩니다.
 Z : Zero로 ALU operation의 결가가 0인경우 set이 됩니다. 보통 비교연산중 같은지를 비교할 때 많이 사용됩니다.
(왜냐하면 컴퓨터에서 비교연산을 하는 방법은 a와 b가 같은지 볼 때 a에서 b를 빼서 0이 나오면 같다는 의미이므로 z flag를 사용합니다.)
 C : Carry로 ALU operation의 결과 혹은, shift operation의 결과가 carry출력이 발생하면 set이 됩니다.
 V : oVerflow로 산술연산시 sign bit를 넘어서면 V가 Set이 됩니다.

SPSR을 알아보자면 SPSR은 Saved Program Status Register로 지금 실행되고 있는 Mode를 실행하기 바로전의 CPSR을 저장하는 것으로 하는 역할은 같습니다.

이번 절은 다른분들의 블로그에서도 많이 참조하였습니다. 다른것들은 몰라도 이 내용은 여러군대서 소개되어 있더라구요. 

'ARM(Advanced RISC Machine)' 카테고리의 다른 글

2 - ARM과 Assembly  (0) 2009.10.23
1.4 - ARM의 Instructions  (0) 2009.10.23
1.2 - ARM과 Bekeley RISC  (0) 2009.10.23
1.1 ARM과 RISC (RISC란 무엇인가?)  (0) 2009.10.23
1 - ARM 이란 무엇인가?  (0) 2009.10.23

+ Recent posts