C ユーザーズガイド

引数を渡す仕組み

本節では ANSI C における引数の渡し方法について説明します。

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

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

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

(SPARC)

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

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

double および long double 型を除くすべての引数は 4 バイトの値として渡されます。double 型は 8 バイトの値として渡されます。先頭 6 個の 4 バイト値 (double を 8 と数える) は %o0 から %o5 までのレジスタに渡され、残りはスタック経由で渡されます。構造体の場合は、構造体のコピーが作成され、ポインタがそのコピーに渡されます。long double は構造体と同様に渡されます。

関数から戻った後、スタックから引数をポップするのは呼び出し側の責任です。上記のレジスタは、呼び出し側から見えます。

(x86)

関数は integer 型の結果をレジスタ %eax に返します。

long long の結果はレジスタ %edx%eax に返されます。float、double、 long double 型の結果はレジスタ %st(0) に返されます。

struct、union、long long、double、long double を除くすべての引数は 4 バイト値として渡されます。long long は 8 バイト値として、また long double は 12 バイト値としてそれぞれ渡されます。

structunion はスタックにコピーされます。サイズは 4 の倍数バイトに丸められます。structunion を返す関数は、その structunion を格納する場所を指す隠された最初の引数に渡されます。

関数から戻った後、スタックから引数をポップするのは呼び出し側の責任です (呼び出された関数によってポップされる structunion の余分な引数を除く)。