Embedded/이론

[Embedded] ARM 구성 레지스터

유제필 2022. 11. 15. 21:18

ARM Register

ARM 프로세서는 32비트 길이의 레지스터를 총 40개 가지고 있다.

데이터 연산을 할 때 사용하는 범용 레지스터(General Purpose Register) 32개,

프로세서의 동작 상태를 나타낼 때 사용하는 상태 레지스터(Status Register) 7개

프로그램을 제어할 때 사용하는 프로그램 카운터(PC, Program Counter) 1개로 구성되어 있다.

범용 레지스터(General Purpose Register)

범용 레지스터는 데이터 처리나 데이터 전송 등 다양한 목적으로 사용된다.

32개의 범용 레지스터는 8가지의 ARM 동작 모드에서 공유하여 사용하는 레지스터와

각 동작 모드별로 할당된 레지스터가 있다.

각 동작 모드별로 할당되는 레지스터는 서로 다른 동작 모드에서는 사용할 수 없다.

프로그램 카운터 레지스터(Program Counter Register)

프로그램 카운터란 프로그램을 읽어올 메모리의 위치를 나타낸다.

즉, 다음 실행될 명령어의 주소를 가지고 있는 레지스터이다.

 

ARM 상태에서는 [31:2]에 읽어올 명령어의 어드레스를 저장하며 비트[1:0]은 0으로 채워지고,

Thumb 상태에서는 [31:1]에 어드레스를 저장하고 비트[0]은 0으로 채워진다.

1개만 존재하는 프로그램 카운터 레지스터는 모든 동작 모드에서 공유하여 사용된다.

상태 레지스터(Status Register)

상태 레지스터는 총 7개로, 6개의 SPSR, 1개의 CPSR로 구성되어 있다.

CPSR(Current Program Status Register)

CPSR은 현재 동작 중인 프로세서의 상태를 나타내고 있는 레지스터이다.

프로세서의 상태란 프로세스의 동작 모드(8가지), 수행되는 명령어의 종류(ARM, Thumb)를 나타낸다.

추가로 연산 결과가 0 또는 캐리(Carry)가 발생했는지, 오버플로우(Overflow)가 발생했는지에 대한 정보도 가지고 있다.

이 레지스터를 이용하여 인터럽트 동작 모드인 IRQ, FIQ를 켜거나 끌 수 있다.

ARM의 8가지 동작 모드에서 공유해서 사용한다.

SPSR(Saved Program Status Register)

SPSR은 이전 동작 모드의 CPSR을 복사해 보관하는 레지스터이다. 즉, CPSR과 표현되는 정보가 동일하다.

ARM 모드에서 유저 모드, 시스템 모드 2가지를 제외한 나머지 모드에서는 예외 처리에 의해 모드 전환이 이루어지는데,

모드 전환이 이루어지는 이 때 이전 동작 모드의 CPSR을 복사해 SPSR이 보관한다.

SPSR은 유저 모드, 시스템 모드를 제외하고 각각 6개의 동작모드에서 1개씩 할당되어 사용된다.

ARM 명령어 상태의 동작 모드 레지스터

ARM 프로세스는 각각의 동작 모드에서 사용할 수 있는 범용 레지스터가 PC까지 포함 총 16개로 구성되어 있다.

각각의 범용 레지스터는 R0부터 R15까지 이름이 부여되어 있으며,

R15는 PC의 사용 용도에 따라 R15 또는 PC로 사용되기도 한다.

PC는 일반 범용 레지스터와 동일하게 각종 데이터 처리나 데이터 전송에도 자유롭게 사용될 수 있다.

PC를 포함한 대부분의 레지스터는 모든 동작 모드에서 공유된다. 다른 일부 레지스터들은 동작 모드별로 사용한다.

별도로 할당된 레지스터는 대부분 특수한 목적으로 사용되는데, 이 레지스터는 R13과 R14가 있다.

스택 포인터(Stack Pointer) - R13 or SP

범용 레지스터 중 R13은 R13 또는 스택포인터로 사용될 수 있는 레지스터이다.

스택포인터는 프로그램에서 사용하는 메모리 중 스택의 TOP 위치를 저장한다.

링크 레지스터(Rink Register) - R14 or LR

범용 레지스터 중 R14는 R14 또는 링크 레지스터로 사용될 수 있는 레지스터이다.

링크 레지스터는 서브루틴 함수에서 되돌아갈 주소를 저장하거나 예외 처리 후

돌아갈 주소를 저장하고 있는 레지스터이다.

아래의 그림은 ARM 명렁어 상태에서의 각 모드별 사용 가능한 레지스터를 나타낸다.

표에서 색이 파란색으로 표시된 레지스터 R13, R14, SPSR은 각각 모드에 따라 별도로 할당되어 사용됨을 뜻한다.

흰색으로 표시된 레지스터 R0 ~ R12, R15(PC), CPSR은 모든 동작 모드에서 공유하여 사용하는 것을 뜻한다.

다른 동작 모드와 다르게 FIQ 모드에서는 R8 ~ R12까지도 별도로 할당된 레지스터를 사용한다.

여기서 별도로 할당된 레지스터라는 뜻은 그 레지스터 안에 들어있는 값을 읽을 때, 해당 모드에서만

그 값을 확인할 수 있는 것을 말한다.

Thumb 명령어 상태의 동작 모드 레지스터

Thumb 상태의 경우 레지스터의 사용이 ARM 명렁어 상태와는 다른 구조로 되어있다.

구성은 아래의 그림과 같다.

표에서 색이 파란색으로 표시된 레지스터 SP, LR, SPSR은 각각 모드에 따라 별도로 할당되어 사용됨을 뜻한다.

흰색으로 표시된 레지스터 R0 ~ R7, PC, CPSR은 모든 동작 모드에서 공유하여 사용하는 것을 뜻한다.

ARM 명령어 에서는 fiq의 경우 더 많은 레지스터를 할당되어 사용되었지만, Thumb 명령어의 경우 모두 동일하다.

'Embedded > 이론' 카테고리의 다른 글

[Embedded] 임베디드 리눅스란  (0) 2022.11.15
[Embedded] 상태 레지스터 구조  (0) 2022.11.15
[Embedded] ARM 동작 모드와 레지스터  (0) 2022.11.15
[Embedded] ARM의 개요  (2) 2022.11.15
[Embedded] 명령어 구조  (0) 2022.11.15