JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  C 编译器介绍

2.  特定于 C 编译器实现的信息

3.  并行化 C 代码

4.  lint 源代码检验器

5.  基于类型的别名分析

6.  转换为 ISO C

7.  转换应用程序以适用于 64 位环境

8.  cscope:交互检查 C 程序

A.  按功能分组的编译器选项

B.  C 编译器选项参考

C.  实现定义的 ISO/IEC C99 行为

D.  C99 的功能

E.  实现定义的 ISO/IEC C90 行为

F.  ISO C 数据表示法

F.1 存储分配

F.2 数据表示法

F.2.1 整数表示法

F.2.2 浮点表示法

F.2.3 异常值

F.2.4 选定的数的十六进制表示

F.2.5 指针表示法

F.2.6 数组存储

F.2.7 异常值的算术运算

F.3 参数传递机制

F.3.1 32 位 SPARC

F.3.2 64 位 SPARC

F.3.3 x86/x64

G.  性能调节

H.  Oracle Solaris Studio C:K&R C 与 ISO 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 中返回,排序相似。

doubleslong double 外,所有参数都作为 4 字节值来传递。double 作为 8 字节值传递。前六个 4 字节值(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 函数返回类型所使用的寄存器 (-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.pdf 上的 AMD64 psABI

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

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

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