본문 바로가기
한국으로/ARM

AAPCS와 레지스터 테이블

by 영킴. 2018. 7. 21.

AAPCS에 의한 각 Register의 사용법 테이블


출처: http://recipes.egloos.com/4988629



AAPCS (Procedure Call Standard for ARM Architecture)

argument 전달

int function(int a, int b, int c, int d) 의 경우,

R0 := a, 
R1 := b, 
R2: = c, 
R3 := d


이런 순서대로 레지스터에 전달된다.


함수의 return 값은 R0에 들어가게된다. 따라서 R0 레지스터에 들어온 인자 a가 계속 필요하다면 스택에 대피시키는 작업도 필요하다!

인자는 4B align을 준수해야하기 때문에 잘 고려해서 함수를 설계해야 한다. 가급적 인자는 4개 이하로 만들자.


8B 데이터 (long long int, double, long double)는 반드시 R0, R2 align 및 스택의 8B align 주소(0x0, 0x8)을 준수해야 한다.

일단 레지스터 R0~R3에 인자가 저장되지만, 더 많은 양의 데이터가 들어오면 stack에 연속하여 저장된다.


함수 내에서 4B align, 함수 간 8B align (v5 이후)

스택은 FD 스택을 사용함. SP는 스택에 저장되는 첫 argument의 주소이고 8B align 상태여야 한다.




Scratch Register

R0-R3, R12 는 마음대로 훼손시켜도 되는 Scratch Register이다.
가급적이면 함수는 이러한 레지스터를 이용해 설계한다.

함수 내에서 손상된 Scratch Register들은 함수 호출 후 복귀한 뒤에 Caller가 복구한다. (훼손되면 안되는 R0-R3, R12, LR)
Callee는 자체적으로 훼손시킨 R4-R11, R13에 대한 보존 책임이 있다.

특히, LR(Link Register)는 함수 호출로 값이 변경되었다면 반드시 복구해야한다.


'한국으로 > ARM' 카테고리의 다른 글

ARM Mode(모드) and Exception(예외)  (0) 2018.07.24
Tail Call  (0) 2018.07.24
정수 승격과 형변환 문제  (0) 2018.07.22
다중 메모리 이동: LDM, STM  (0) 2018.07.22
ARM의 특수 용도 레지스터  (0) 2018.07.21
호출 규약 __cdecl 과 __stdcall의 차이점  (0) 2018.07.21
volatile이 필요한 경우  (0) 2018.07.21
C Runtime Startup  (0) 2018.07.21