Oracle® Developer Studio 12.5:C 用户指南

退出打印视图

更新时间: 2016 年 7 月
 
 

9.3 参数传递机制

本节介绍了在 ISO C 中如何传递参数。

  • 传递给 C 函数的所有参数均通过值进行传递。

  • 实际参数按函数声明中声明参数的反向顺序传递。

  • 本身为表达式的实际参数在函数引用之前求值。然后表达式的结果置入寄存器或推入堆栈。

G.3.1 32 位 SPARC

函数在寄存器 %o0 中返回 integer 结果,在寄存器 %f0 中返回 float 结果,在寄存器 %f0%f1 中返回 double 结果。

long long 整数以较高词序在 %oN 寄存器中进行传递,以较低词序在 %o(N+1) 寄存器中进行传递。寄存器中的结果在 %o0%o1 中返回,排序相似。

doubleslong double 外,所有参数都作为 4 字节值来传递。double 作为 8 字节值传递。前六个 4 字节值(double 计为 8)在寄存器 %o0%o5 中传递。其余值传递到堆栈中。结构的传递方式是复制结构并将指针传递到副本。long double 的传递方式与结构的传递方式相同。

此处描述的寄存器是可被调用程序识别的寄存器。

G.3.2 64 位 SPARC

所有整型参数均作为 8 字节值传递。

浮点参数尽可能在浮点寄存器中传递。

G.3.3 x86/x64

遵循 Intel 386 psABI 和 AMD64 psABI。

函数在以下寄存器中返回结果:

表 120  x86 函数返回类型所使用的寄存器 (-m32)
返回的类型
寄存器
int
%eax
long long
%edx%eax
floatdoublelong double
%st(0)
float _Complex
实部为 %eax,虚部为 %edx
double _Complexlong double _Complex
与包含相应浮点类型的两个元素的结构相同。

有关详细信息,请参阅 http://www.x86-64.org/documentation/abi.pdfhttp://www.x86–64.org/documentation/abi.pdf 上的 AMD64 psABI

除了 structunionlong longdoublelong double 之外的所有参数都作为 4 字节值传递;long long 作为 8 字节值传递,double 作为 8 字节值传递,long double 作为 12 字节值传递。

structunion 被复制到堆栈中。大小向上舍入为 4 字节的倍数。返回 structunion 的函数被传递一个隐藏的首参数,并指向返回的 structunion 的存储位置。

从一个函数返回时,调用程序负责从堆栈中弹出参数,但 structunion 返回的附加参数除外,它由调用的函数弹出。