전에 일하던 때에 프로그램을 디버깅하면서 레지스터에대해서 정확한 개념이 없이 구름을 잡듯지나가던 때가 있었는데.. 이제는 어느정도 감이 잡힘니다.^^;

먼저 arm에서 cpu레지스터는 R0~R14, PC, CPSR이렇게 나누어지는데 총 17가지로 명명되는 레지스터가 있는데, 그럼 ARM에서의 레지스터는 총17개가 되어야한다고 생각하기 쉬운데, 총 37개가 된다고 합니다.

그 이유는 arm에서 레지스터는 cpu의 상태와 연관이 있는데 cpu의 상태는 대략 7가지 모드를 가지의 모드를 가지기 때문입니다..

ARM에서 CPU의 모드는 user, system, fiq, irq, supervisor, abort, undef 이상의 7가지 모드가 있다. 인터럽트가 발생을 하면 이 7가지 모드중을 하나의 상태를 cpu는 가지게되고, 각 모드마다 공통적으로 사용하는 레지스터가 있고, 특별하게 다른 기억장치를 쓰는 레지스터도 있다. R0~R7번,PC,CPSR은 어떤 모드에서건 공통적으로 사용을하고 나머지 레스트터는 상태에 따라 다른 레지스터를 사용한다.

일단 특정한 용도로 쓰이는 레지스터를 생각해보도록 하자.

 R13은 SP라는 예약어로 어셈블러나, 소스레벨에서 끌어서 쓸 수가 있으며 각 모드마다 물리적으로 다른 레지스터가 사용된다. 단 user와 system모드에서는 같은 물리적 레지스터를 사용한다. 용도는 현재 모드의 스텍포인터를 저장하고 있다.

R14번은 LR이라는 약어로 쓰이며 어셈과 소스에서 사용이가능하고 서브루틴이 되돌아오기 위한 링크레지스터로 사용된다. LR또한 물리적으로 6개가 존재한다.

그리고 R15번은 PC라는 약어로 사용되며 program counter라고 하며, 현재 실행되는 인스트럭션의 주소관련 정보를 나타낸다.[1:0]비트는 0으로 세팅되며 [31:2]비트는 주소정보를 싫고있다.

또한 CPSR이라는 레지스터가 있는데 이는 current program status register의 약어이며, 현재 프로그램의 상태를 나타내며, [4:0]비트는 cpu의 7가지 모드정보를 가지고 있으며 [5]비트는 thum코드인지 arm코드인지를 나타낸고 [6]비트는 1로 세팅이되면 FIQ인터럽트를 튀지않게 할 수 있으며, [7]비트는 1로 세팅이 되면 IRQ인터럽트를 튀지 않게 할 수가 있다.

그리고 [31:28]까지의 4비트는 N,Z,C,V를 의미하며 negative, zero, carry, overflow비트들을 나타낸다.

그리고 user모드와 system모드를 제외한 5개의 모드에서 SPSR이라는 물리적으로 틀린 레지스터를 각 모드별로 가지고 있다. 이곳은 Exception이 일어났을때 CPSR을 저장해 놓기 위한 곳으로 사용된다.


이상이 arm에서의 레지스터에대한 간략한 설명이다.


더 자세한 내용은 armref문서를 같이 올려 놓았습니다.

by sminchoi 2007. 2. 22. 09:51
| 1 |