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

标签 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 - 其他值

这是正确的还是发生了其他事情? 或者它只是传递了结构的 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/

相关文章:

c - 根据用户输入重复while循环

c - 为什么这个程序在 C11 中编译得很好,但在 C99 中却编译不好?

c - 通过将结构嵌套在 union 中来为结构生成填充字节

architecture - Docker - 在 Mac 上构建 rpi 镜像

c - 从 ARM 5 迁移到 ARM 6 编译器 : Unknown type name '__STATIC_INLINE' in ARM CMSIS file

c++ - 如何使用向后 cpp 在 ARM 上获取堆栈跟踪

java - 将 Java GUI 添加到 C 客户端

c - RBIE 中断仅工作一次 - PIC16F877A

C 中的 char* 和 boolean 值 TRUE FALSE

c - 如何在C中的struct中添加元素