ATPCS 란?

C/C++ 언어에서 함수를 호출하거나 호출 받을 때는 매개변수나 반환값을 주고 받게 되어있다. 이러한 규칙을 PCS (Procedure Call Standard)라고 한다.

우리가 편지를 보낼때 좌측상단에는 보내는곳의 주소, 우측하단에는 받는 곳의 주소를 적으면 어느나라든 보낼 수 있는 것 처럼 함수간에도 그러한 규칙이 존재 하는 것이다.

ATPCS 는 ARM모드와 Thumb 모드 둘 다 호환되는 함수 호출 규약을 말한다.

ARM 레지스터

ARM 아키택쳐에는 다음과 같은 ARM모드와  Thumb모드에서 사용하는 레지스터 들이 있다.


ARM모드에서는 r0 부터 r15까지 사용하고 Thumb 모드에서는 r0부터 r7 에 r13, r14, r15 레지스터를 사용한다.
r0부터 r3까지의 4개는 함수 호출시 매개변수와 함수 수행수 반환되는 값을 저장하는 용도로 사용된다. 일반적으로 r4부터 r11까지는 함수의 지역변수로 사용된다. (물론 Thumb모드에서는 r7까지 사용한다.)

프로그램 성능 최적화를 거론할 때 매개변수는 4개, 지역변수는 8개 이내로 사용하는 것이 좋다는 이야기는 레지스터 사용을 효율적으로 하기 위함이다. 레지스터가 부족하게 되면 매개변수는 스택에 공간을 마련해야 하며, 지역변수는 힙(Heap)영역에 저장해야 한다.

r12부터 r15까지는 특수한 용도로 사용되는데 그 역할이 특별하여 IP, SP, LR, PC 라고 불린다.

함수가 호출되는 과정

함수 호출은 LR에는 돌아올 주소를 저장하고 PC에는 호출되는 함수의 주소를 넣어 그곳으로 이동한다.
돌아올 때는 저장한 LR을 다시 PC에 넣어주면 된다.

매개변수는 r0 ~ r4까지 사용하는데 만약 32bit이 넘는 long long 같은 변수는 32bit씩 쪼개어 r1, r2로 나누어 저장한다.
(함수의 원형을 long long형 변수를 int형 변수 2개로 분리하여 구현된 함수가 있는데 사실 그럴필요는 없다.)

리턴값은 r0를 사용한다. 매개변수와 마찬가지로 long long형을 반환할때는 r0, r1를 사용한다.

그림. 매개변수와 리턴값 저장

STACK UNWINDING

굳이 우리말로 번역하자면 스택 복기 정도가 되겠다.

함수 호출이 되풀이 되면 각 함수마다 하위 함수 호출시 자신의 정보(지역변수, 리턴값)를 복구하기 위해 함수 호출 규약에 의해 d위 그림과 같이 스택에 쌓게된다. 스택을 따라 역으로 추적하면 자신의 함수를 호출한 함수들의 정보를 알 수가 있는 것이다.
이 정보는 디버깅시 유용하게 사용되는데, 시스템이 예외가 발생하거나, 무한 루프에 빠질경우 이런한 원인을 찾는데 꼭 필요하다.

STACK OVERFLOW

위와 같이 스택은 함수 호출관계에 있어 중요한 정보를 담고 있다. 만약 스택으로 할당된 공간이 부족하여 넘치거나 힙영역에서 침범해 오는 경우. 시스템의 치명적인 오류가 발생하게 되는 것이다.


저작자 표시 비영리 변경 금지
신고
Write your message and submit
« PREV : 1 : 2 : 3 : 4 : 5 : 6 : 7 : ··· : 14 : NEXT »