본문 바로가기
시스템 반도체/Arm

Arm register 종류 ( SP, LR, PC, NZCV, CPSR, APSR, CPS 명령어)

by 전컴반 2022. 4. 7.
반응형

Arm CPU는 16개의 레지스터를 가지고 있으며 서로 다른 9개의 동작을 할 수 있다. System level view에 해당한다.

먼저, 아래 표에서 헷갈리는 용어를 간단히 보자,

 

IRQ는 Interrupt이다.

FIQ는 Fast Interrupt Mode이다.

R13 == SP ( Stack Pointer )

R14 == LR ( Link Register )

R15 == PC ( Program Counter )

APSR, CPSR는 아래 따로 정리하겠다.

 

 

빈칸은 해당 동작을 하지 않아서가 아니라, 어떤 모드일 때든 똑같은 물리적인 주소를 사용하기 때문에 비워놓은 것이다.

무슨 말이냐면, R0 ~ R7까지는 어떤 모드에서 동작을 하더라도 똑같은 자리에서 데이터를 찾는다. 하지만 R8 ~R12는 FIQ동작을 할 때는 물리적으로 분리된 다른 주소에서 동작한다는 의미다.

(R0 ~ R7는 Unbanked registers라고 부른다.)

(R8 ~R14는 Banked registers라고 부른다.)

 

특수 레지스터인

SP ( Stack Pointer )

LR ( Link Register )

PC ( Programm Counter )

 

위 레지스터를 좀 더 자세히 보자면,

 

SP는 스택에 데이터가 채워진 위치를 가리키는 레지스터다. SP가 가리키는 곳까지가 데이터가 채워진 영역이고, 그 이후부터 스택 끝까지는 비어있는 영역이다. 스택에 새로운 항목이 추가되거나 스택에서 데이터가 제거되면, 스택 포인터의 값이 증가하거나 감소한다. 

 

LR는 반환 주소를 기억한다. 반환 주소란, 예를 들어 어떤 함수를 실행하고 마치면 다시 main으로 돌아올 주소를 말한다. 

이 주소가 LR에 저장되는 것이다.

 

PC는 똑같이 실행 주소를 가리키는데 RISC-V에는 PC가 레지스터에 밖에 있었다. 하지만 Arm에서는 레지스터 안에 들어가 있는 차이가 있다.

 

 

CPSR ( Current Program Status Register )

 

위에 범용 레지스터와 다르게 따로 떨어져 나와있는 레지스터다. format은 아래와 같다.

 

 

하나씩 보면 제일 오른쪽에 있는 M bit을 보면 Mode를 나타낸다. 예를 들면 10000일 때는 user mode, 10001일 때는 FIQ mode 이런 식으로 어떤 동작을 할지 나타낸다.

 

 

+ mode를 바꿀 때 사용하는 명령어CPS (Change Processor State)로 예를 들어 CPS #0x13 하면 SVC mode로 바뀐다. 또한 CPSIE aif 하면 AIF bit를 0으로 세팅한다는 의미다. IE는 interrupt enable인데 즉 interrupt를 하겠다는 의미다.

반대로 CPSID 하면 interrupt disable이라는 의미로 특정 bit를 1로 세팅한다는 의미다.

그래서 cpsie a, #10 하면 A bit를 0으로 만들고 mode는 user mode로 바꾸겠다는 의미다.

 

 

다음으로 앞에 NZCV bit, 이 네 개의 Flag는 integer를 비교하는 역할을 한다. 비교라 함은, ==, >, <와 같은 조건을 확인한다.

N Flag는 negative를 의미한다. integer를 비교할 때 나타내니 1이면 음수라는 의미고, 0이면 양수 거나 0이라는 의미는 나타낸다. 2의 보수를 사용하니 MSB를 보고 판단한다. 1이면 음수, 0이면 양수 

Z Flag는 zero를 의미하는데 비교 결과가 0일 때 1로 세팅된다.

C Flag는 carry를 의미한다. 어떤 연산을 하고 carry가 발생했는지 안 했는지 여부를 적어준다. carry가 발생했다면 1로 세팅된다. 

V Flag는 ovwrflow를 의미한다. 연산의 범위가 넘어갔을 때 1로 세팅된다.

 

A bit가 1로 세팅된다면 어떤 Exection이 발생했다는 의미다.

I bit가 1로 세팅된다면 I/O 장치가 interrupt를 발생시켰다는 의미다. 그러니 다른 interrupt를 하지 않겠다는 의미다. 즉 어떤 이벤트가 발생하더라도 다 무시한다.

F bit가 1로 세팅된다면 Fast interrupt를 하지 않겠다는 의미다. 위 Ibit와 똑같다. 

 

J bit, T bit를 이용하여 instruction set을 바꿀 수 있다.

00일 때는 Arm instruction,

01일 때는 Thumb,

10일 때는 jazelle,

11일 때는 ThumbEE와 같이 말이다.

 

 

 

APSR ( Application Program Status Register )

 

APSR은 CPSR과 물리적으로 같은 레지스터를 사용하지만 다른 점은 일정 부분을 접근할 수 없다는 것이다.

 

이유는 어떠한 안전성 때문이다. CPSR에서 나타내는 bit들을 바꿨을 때 큰 위험이 있을 수도 있으니, 특정 mode가 되면

APSR로 바뀌어 정보에 예민한 다른 부분은 건들 수 없게 하는 것이다. user mode에서 사용하는 cpsr이라고 보면 된다. 

 

 

반응형

댓글