2011-12-07 3 views
0

스택 기반 구조가 ARM 어셈블리의 서브 루틴으로 전달되는 방식은 무엇입니까? 예를 들어ARM에서 스택 기반 구조에 대한 호출 규칙?

는 :

이 경우
typedef struct SomeStruct { 
    uint32_t one; 
    uint32_t two; 
    uint32_t three; 
    uint32_t four; 
} SomeStruct; 

void SomeFunction(uint32_t someValue, SomeStruct someStruct, uint32_t otherValue); 

, 어떻게 구조가 전달 될 것인가? 내 생각은 다음과 같습니다

  • r0 - someValue
  • r1 - someStruct.one
  • r2 - someStruct.two
  • r3-someStruct.three
  • *sp-someStruct.four
  • *sp,#4 - otherValue

맞습니까? 아니면 다른 것이 있습니까?아니면 그냥 구조체의sp을 전달하면됩니까?

+0

이제 생각해 보면, 내 추측은 정말 어리 석다. –

+0

구조체가 실제로 작지 않다면 구조체를 직접 전달하는 것이 일반적이지 않습니다. 구조체에 포인터를 전달하면 funciton을 호출하는 오버 헤드가 줄어 듭니다. – TJD

+0

@ TJD : 논리적으로 복사본이기 때문에 문제가 있습니다. 따라서 호출자가 SomeFunction (1, my_global_struct, 1);을 수행하고 호출 수신자가 if (& someStruct == & my_global_struct)를 수행하면 물론 false 여야합니다. 따라서 호출 규칙은 포인터를 전달할 수 있으며 도움이 될 수 있지만 호출 수신자가 여전히 복사본을 가져야하는 경우가 있습니다.이 경우 오버 헤드가 적습니다. –

답변

4

ABI 여기에 ARM에 대해 "프로 시저 호출 표준"있다 : http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf

가 하나 이상의 ABI는 ARM에 대한, 그리고 다시는 64 비트 ARM에 대한,하지만 그냥이 일을보고, 관련 부분은은 "5.5 매개 변수 전달". 한눈에, 나는 C.5가 당신 말이 맞다고 생각한다.이 구조체는 r1-r3과 스택 사이에서 분리 될 것이다.

B.1은 복합 유형의 인수를 메모리의 복사본에 대한 포인터로 대체 할 수 있으며 호출자와 호출 수신자 모두 값으로 전달하기 위해 완전한 유형으로 SomeStruct을 가져야하므로 C에서는 적용되지 않습니다.

+0

특히 ARM ABI를 보지 못했지만 호출자가 주소를 전달하도록하여 구조체를 전달하고 반환하는 것을 처리하는 것은 매우 일반적입니다. 호출 된 함수가 C로 작성된 경우 주소는 사용자 코드에 노출되지 않습니다. 대신 컴파일러는 종종 구조체를 복사하는 코드를 생성합니다. 루틴이 한 번만 호출되면 호출자가 복사본을 작성하는 것이 더 나을 것입니다. 그러나 대부분의 루틴은 호출 된 코드가 복사를 수행하는 것이 더 효율적이기 때문에 호출됩니다. – supercat