본문 바로가기
관리자 기고

C Programming & ARM Procedure call Standard(작성 중)

by 와이즈캣 2019. 4. 3.
728x90
반응형

ARM 개발자들 사이에서는 함수 호출에 대한 인자 이야기는 이제 거의 상향 평준화 되었다고 봅니다.
오래된 떡밥에 대해 글을 또 쓰는 건 그냥 혹시 또... 필요하지 않을런가 싶어서 입니다.

참고 자료는 아래를 참조했습니다.

https://developer.arm.com/docs

 

Documentation – Arm Developer

Find technical manuals and other documentation for Arm products. Click on one of the headings below to get started or use the search box at the top of this page.

developer.arm.com

ATPCS.pdf
0.16MB



일반적인 C 프로그래밍에서는 인자의 개수를 특별히 고려하지 않습니다.
특히 덩치가 큰 자료의 경우 구조체를 만들고 포인터를 사용해서 전달하는 방법을 많이 사용합니다.
하지만 인자가 5개 정도인 경우는 어떠할까요?
구조체를 만들수도 있지만 그냥 인자를 5개 사용하여 프로그래밍을 작성하는 경우가 있습니다.
이 경우 ARM에서는 매우 비효율적인 코드가 되어 버립니다.
이 글은 왜 비효율적인 코드가 만들어 지는 가에 대한 설명을 하고자 하는 글입니다.
별 필요가 없는 글이 될지도 모르겠습니다.


아래의 소스를 고려해 봅니다.

인자가 다양한 함수들

그냥 그런저런 소스입니다.
그러나 ARM에서는 함수의 인자 4개까지가 손익 분기점이 됩니다.
이유는 HW에 기인하는데 ARM은 실행속도의 효율성을 높이기 위해 전용 레지스터들을
많이 고안해 냈습니다. 이러한 레지스터 중 함수 호출의 인자에 활용되는 레지스터가 있는데
이게 4개가 준비되어 있습니다. ARM Core 쓴다면 모두 다 공통입니다.
인텔계열은 이러한 레지스터가 별도로 준비되어 있지 않습니다.
그러니 인텔의 경우 구조체를 사용한 인자 전달이 가장 효율적인 방법일 수 있겠네요.

참고 : ARM문서에서는 C언어의 함수 개념을 프로시저 : Procedure 라고 호칭합니다.

#include <stdio.h>

void test1(int a1)
{
}
void test2(int a1, int a2)
{
}
void test3(int a1, int a2, int a3)
{
}
void test4(int a1, int a2, int a3, int a4)
{
}
void test5(int a1, int a2, int a3, int a4, int a5)
{
}
void test6(int a1, int a2, int a3, int a4, int a5, int a6)
{
}
int main()
{
    test1(1);
    test2(1,2);
    test3(1,2,3);
    test4(1,2,3,4);
    test5(1,2,3,4,5);
    test6(1,2,3,4,5,6);

    return 0;
}

 

 

이제 디버깅을 시작해 보겠습니다.
VS2019를 이용하여 원격 디버깅을 했습니다.
요즘 핫한(?)방법 중 하나입니다.
이렇게 핫한 방식을 끌어 와서 설명하다니... 참 좋은 블로그입니다.
이런...

VS2019에서의 라즈베리파이 원격 디버깅

위 디버그 방식은 아래 링크를 참조하시기 바랍니다.
아래 : https://wowcat.tistory.com/3059

 

Visual Studio 2019 환경에서 라즈베리파이 C 프로그래밍 (raspberrypi C Programming in VS2019) #1

VS2019의 설치의 설정 관련 부분은 현재 글 작성 후 시간을 내어서 추가로(#2로) 작성하겠습니다. 설치할 때 설정이 다르면 아래의 리눅스 빈프로젝트가 안나올 수 있습니다. 위의 과정이 끝났다면 이제 빌드를..

wowcat.tistory.com

C 소스를 보시면 25라인에서 브레이크 포인터가 걸려 있는 것을 확인할 수 있습니다.
레지스터 정보를 보시면 프로그램 카운터와 디스어셈블리의 브레이크 포인터 주소가 일치하는 걸 보실 수 있습니다.
스택포인터를 참고하여 메모리1을 스택이 모니터링 가능하도록 띄어 봤습니다.

728x90