ARM系统中,在函数调用的时候,参数是通过哪种方式传递的?

在 ARM 架构中,函数调用参数的传递遵循特定的调用约定,这些约定定义了如何通过寄存器和堆栈来传递参数。这种约定最主要的是 ARM 的标准调用约定,即 AAPCS(ARM Architecture Procedure Call Standard),也称为 ARM EABI(Embedded Application Binary Interface)。

ARM 调用约定的基本规则:

  1. 寄存器传递
    • 前四个整数或指针参数通常通过寄存器 r0r3 传递。
    • 浮点参数(在支持硬件浮点运算的 ARMv7 架构中)通常使用浮点寄存器 s0s15 传递,每个参数使用一个浮点寄存器。
    • 如果参数数量超过寄存器的数量,剩余的参数会被压入堆栈。
  2. 堆栈传递
    • 当参数不能全部放入寄存器时,或者参数类型需要更多的寄存器空间时(例如大的结构体或联合体),额外的参数需要通过堆栈传递。
    • 堆栈参数从右到左压栈,调用者负责清理堆栈。
  3. 返回值
    • 函数的返回值通过 r0(对于整数或指针类型)传递。
    • 浮点数返回值通过 s0 寄存器传递。
    • 如果返回类型是大型结构体或联合体,调用者会在堆栈上分配空间,并将指向这个空间的指针作为一个隐含的第一个参数传递给被调用函数。被调用的函数将返回值复制到这个地址,而不是直接通过寄存器返回。
  4. 堆栈对齐
    • 在调用时,堆栈必须保持8字节对齐,这有助于提高访问速度并满足某些数据类型的对齐要求。

这些规则确保了在不同的 ARM 平台和编译器之间,函数调用和参数传递的一致性和可预测性。它们允许编译器生成更优化的代码,并使得手写汇编代码能更容易地与由高级语言编译的代码进行交互。在实际的应用编程和系统开发中,遵循这些调用约定是非常重要的,以确保程序的正确运行和最优性能。

发表评论

后才能评论