Oracle® Developer Studio 12.5: C ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

9.3 引数を渡す仕組み

本セクションでは ISO C における引数の渡し方について説明します。

  • C の関数への引数は、すべて値渡しされます。

  • 実引数は関数の宣言において宣言されるのと逆の順序で渡されます。

  • 式である実引数は、関数参照の前に評価されます。その後、式の結果がレジスタに置かれるかスタックにプッシュされます。

G.3.1 32 ビット SPARC

関数は integer 型の結果をレジスタ %o0 に、float 型の結果wpレジスタ %f0 に、double 型の結果をレジスタ %f0%f1 に返します。

long long 型整数は、上位ワード順序は %oN、下位ワード順序は %o(N+1) でレジスタに渡されます。レジスタ内の結果は同様の順序で %o0%o1 に返されます。

double および long double を除くすべての引数は 4 バイトの値として渡されます。double は 8 バイトの値として渡されます。先頭 6 個の 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
対応する浮動小数点型の 2 つの要素を含む構造体と同じ

詳細は、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 の余分な引数を除き、スタックから引数をポップするのは呼び出し側の責任です。