ARM 개발자들 사이에서는 함수 호출에 대한 인자 이야기는 이제 거의 상향 평준화 되었다고 봅니다.
오래된 떡밥에 대해 글을 또 쓰는 건 그냥 혹시 또... 필요하지 않을런가 싶어서 입니다.
참고 자료는 아래를 참조했습니다.
https://developer.arm.com/docs
일반적인 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를 이용하여 원격 디버깅을 했습니다.
요즘 핫한(?)방법 중 하나입니다.
이렇게 핫한 방식을 끌어 와서 설명하다니... 참 좋은 블로그입니다.
이런...
위 디버그 방식은 아래 링크를 참조하시기 바랍니다.
아래 : https://wowcat.tistory.com/3059
C 소스를 보시면 25라인에서 브레이크 포인터가 걸려 있는 것을 확인할 수 있습니다.
레지스터 정보를 보시면 프로그램 카운터와 디스어셈블리의 브레이크 포인터 주소가 일치하는 걸 보실 수 있습니다.
스택포인터를 참고하여 메모리1을 스택이 모니터링 가능하도록 띄어 봤습니다.
'관리자 기고' 카테고리의 다른 글
이미지모음 배너 로고 (0) | 2020.10.08 |
---|---|
Visual Studio 2019 환경에서 라즈베리파이 C 프로그래밍 (raspberrypi C Programming in VS2019) #1 (0) | 2020.01.11 |
Cortex ARM M Serise Memory Map (0) | 2019.04.06 |
ARM Infocenter Document Link 개발 참고 문서 링크 (0) | 2019.04.06 |
Linux Device Tree LDT DTS dts dtsi with Raspberrypi 라즈베리파이 (작성 중) (0) | 2019.04.02 |
Linux Unix OS Device Driver Firmware BootLoader uboot 에 대한 나의 프리퀄 (0) | 2019.04.02 |
라즈 커널 컴파일(작성 및 수정 중) (0) | 2019.03.29 |
vi vim vimrc 편집기 설정 파일 (0) | 2019.03.29 |