from Project/└ ARM 2009. 5. 24. 21:02

<Basic Pentium CPU Structure>

위 그림은 간단한 펜티엄 CPU의 구조이다. 보시다시피 레지스터(Register)CPU에 들어 있는 일종의 기억장치이다.
가장 가까이에 있는 기억소자로써 가장 빠른 처리가 가능하다.
Assembler에서는 이러한 Register를 직접 다루게 된다.
C Level이상에서는 이 Register와 Memory를 어느정도 알아서 제어해주지만, 어셈블러의 경우 미리 생각해서 control을 해주어야 한다.

모든 CPU마다 비슷한 점도 있지만 Register Set의 구조는 각기 다르다. 예전 필자가 포스팅한 SunSparc의 경우만 해도 ARM과 Register 구조가 상당히 다르다. Register의 구조는 Subroutine호출시 이전Register값들의 보존에 큰 연관이 있다. MIPS의 경우에는 살짝 맛만 보았는데, ARM Processor의 경우는 매우 특이하다.

일단 도식화하면 다음과 같다.


기본적으로 모드별로 6개의 Stack을 가지고 있다. (단 Sys ModeUser Mode는 같은 Stack을 사용한다.)

ARM은 총 37개의 32비트 길이의 레지스터를 가지고 있으며, 37개의 레지스터는
데이터 연산등에 사용되는 범용 레지스터 30개,
프로그램 제어 목적으로 1개의 PC(Program Counter),
                                               - pc는 현재 실행 위치를 나타낸다. pc값을 변경하여 실행 루틴을 바꿔줄 수 있다.
프로세서의 동작상태를 나타내는 상태레지스터 용도로 6개 (CPSR 1+ SPSR 5)

가 사용된다.

그림상에서 R0~R12까지는 FIQ를 제외한 모든 모드에서 Register를 공유한다. FIQ의 경우 빠른 인터럽트처리를 위하여 별도의 레지스터가 존재한다. R13~R15의 경우 별도의 모드마다 각각의 Register 값 을 갖는다.


▶ R13은 스택 포인터(Stack Pointer)로 프로그램에서 사용하는 메모리 중 스택의 Top 위치를 저장한다. 어셈블리어 상에서는 r13이나 sp 두가지로 모두 접근이 가능하다. 각 모드별로 다른 스택 포인터를 갖고 있는다는 의미는 각 모드에서 다른 스택 영역을 사용한다는 것을 의미하기도 한다. 실제로 로딩시 스택의 영역을 잡을때 각 모드별로 시작영역을 따로 잡는다.

R14는 링크 레지스터(Link Register)LR로서 사용된다. 이는 서브루틴 함수에서 되돌아갈 주소를 저장하거나 예외처리 후 되돌아갈 주소 정보를 가지고 있는 레지스터이다.  

R15는 프로그램 카운터(Program Counter)PC라고도 한다. 이는 프로그램을 읽어올 메모리의 위치를 나타낸다. pc에는 함수에서 리턴시, [mov pc, lr] 과 같은 명령어로 다음에 실행될 명령어를 넣어줌으로써 실행시킨다. PC의 경우 하나만 존재하여 모든 모드에서 공유하여 사용하는 Register이다.


 

CPSRCurrent Program Status Register의 약자로 현재 동작중인 프로세서의 상태를 나타내는 레지스터이다. PC와 마찬가지로 모든 모드에서 하나로 공유하여 사용하는 레지스터이다.    


 

32bit로 구성된 CPSR Register는 현재 연산상태에 대한 정보 및 thumb 모드, IRG/FIQ enable 등 제어에 사용된다. 마지막 0~4bit가 현재 모드를 나타내는 bit 정보이다.
위 그림상에서 N,Z,C,V는 각 조건상태를 나타내는 Condition Code이고,
우측의 I는 IRQ Enable 여부, F는 FIQ Enable 여부, T는 thumb Mode 사용 여부이다. 각 모드에 따라 이 부분을 바꿔주게 된다.

(thumb Mode는 명령어 길이가 16bit로 작은 명령어로 이루어 질 필요가 있을때를 고려한 모드이다.)


SPSRSaved Program Status Register로 이전 동작모드의 CPSR 복사본으로 내부 정보는 CPSR과 일치한다.
(Exception 호출시 pc값이 lr값으로 이동되는 동시에 이전 CPSR의 값이 SPSR의 값으로 복사가 하드웨어적으로 이루어 진다.)
User/System 모드를 제외한 모든 모드에는 각각의 SPSR을 갖고 있다. 상태레지스터 CPSR, SPSR은 함부로 연산에 쓰이면 훼손되기 때문에 접근하기 위한 특수한 명령어가 존재한다. - MSR,MRS
또한 강제 모드 변경시에 CPSR_c 같은 레지스터접근 특이연산을 이용해서 우측의 5비트만 바꿔주어야 한다.
재미있는 점은 Exception의 경우 발생은 하드웨어적으로 하지만 복귀의 경우 소프트웨어적으로 설정해 주어야 한다.
이 때 Exception 복귀시 해야할 일은 "이전 LR값을 PC에 넣어주어야 하고 SPSR값을 CPSR에 넣어주어야 한다."는 것
중요한 건 이 두가지 동작이 동시에 일어나야 한다는 것이다.
두가지 명령이 동시에 발생하기 위해서는 특정명렁어를 사용하게 된다. (MOVS, ldmfd ~{}^  등등)

※ Subroutine호출시에는 Mode와는 상관없기 떄문에 SPSR을 고려할 필요가 없다. 
   SPSR, CPSR은 즉 각 모드 변경시 고려해야 한다. (Exception 발생시!)

'Project > └ ARM' 카테고리의 다른 글

ADS 1.2 IDE에서 Source의 Project적용하기.  (0) 2009.08.06
[ARM]Edge trigger, Level trigger  (0) 2009.06.05
[ARM]RS232에 대해...  (0) 2009.06.05
[ARM]USART에 대해...  (0) 2009.06.05
[ARM]타이머/카운터  (0) 2009.05.24
,