在ARM中调用基于堆栈的结构的约定?

时间:2011-12-07 16:52:11

标签: c struct 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 的地址?

1 个答案:

答案 0 :(得分:5)

这里有一个ARM ABI的“过程调用标准”:http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf

ARM有多个ABI,64位ARM也是如此,但只看这一个,相关部分是“5.5参数传递”。乍一看,我认为C.5说你是对的,这个结构将在r1-r3和堆栈之间分开。

B.1,它可以用指向内存中副本的指针替换复合类型的参数,从不在C中应用,因为调用者和被调用者都必须有SomeStruct作为完整类型才能通过值。