本节介绍了在 ISO C 中如何传递参数。
传递给 C 函数的所有参数均通过值进行传递。
实际参数按函数声明中声明参数的反向顺序传递。
本身为表达式的实际参数在函数引用之前求值。然后表达式的结果置入寄存器或推入堆栈。
函数在寄存器 %o0 中返回 integer 结果,在寄存器 %f0 中返回 float 结果,在寄存器 %f0 和 %f1 中返回 double 结果。
long long 整数以较高词序在 %oN 寄存器中进行传递,以较低词序在 %o(N+1) 寄存器中进行传递。寄存器中的结果在 %o0 和 %o1 中返回,排序相似。
除 doubles 和 long double 外,所有参数都作为 4 字节值来传递。double 作为 8 字节值传递。前六个 4 字节值(double 计为 8)在寄存器 %o0 至 %o5 中传递。其余值传递到堆栈中。结构的传递方式是复制结构并将指针传递到副本。long double 的传递方式与结构的传递方式相同。
此处描述的寄存器是可被调用程序识别的寄存器。
所有整型参数均作为 8 字节值传递。
浮点参数尽可能在浮点寄存器中传递。
遵循 Intel 386 psABI 和 AMD64 psABI。
函数在以下寄存器中返回结果:
|
有关详细信息,请参阅 http://www.x86-64.org/documentation/abi.pdfhttp://www.x86–64.org/documentation/abi.pdf 上的 AMD64 psABI
除了 struct、union、long long、double 和 long double 之外的所有参数都作为 4 字节值传递;long long 作为 8 字节值传递,double 作为 8 字节值传递,long double 作为 12 字节值传递。
struct 和 union 被复制到堆栈中。大小向上舍入为 4 字节的倍数。返回 struct 和 union 的函数被传递一个隐藏的首参数,并指向返回的 struct 或 union 的存储位置。
从一个函数返回时,调用程序负责从堆栈中弹出参数,但 struct 和 union 返回的附加参数除外,它由调用的函数弹出。