如何将基于堆栈的结构传递给 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
-其他值
这是正确的还是发生了其他事情? 或者它只是传递了结构的 sp
基础地址?
最佳答案
这里有一个 ARM ABI 的“过程调用标准”:http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf
ARM 的 ABI 不止一个,64 位 ARM 的 ABI 也不止一个,但只看这个,相关部分是“5.5 参数传递”。乍一看,我认为 C.5 说你是对的,这个结构将在 r1-r3 和堆栈之间拆分。
B.1,它可以用指向内存中副本的指针替换复合类型的参数,在 C 中永远不会应用,因为调用者和被调用者都必须具有 SomeStruct
作为顺序的完整类型按值传递。
关于ARM 中基于堆栈的结构的调用约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8419166/