Oracle Solaris Studio 12.2:C 用户指南

F.3 参数传递机制

本节描述在 ISO C 中如何传递参数。

F.3.1 32 位 SPARC

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

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

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

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

F.3.2 64 位 SPARC

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

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

F.3.3 x86/x64

遵循 Intel 386 psABI 和 AMD64 psABI。

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

表 F–21 x86 函数返回类型所使用的寄存器

寄存器  

返回的类型  

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.pdf 上的 AMD64 psABI

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

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

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