ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
Oracle Solaris Studio 12.3: C ユーザーガイド Oracle Solaris Studio 12.3 Information Library (日本語) |
本節では ISO C における引数の渡し方について説明します。
C の関数への引数は、すべて値渡しされます。
実引数は関数の宣言において宣言されるのと逆の順序で渡されます。
式である実引数は、関数参照の前に評価されます。その後、式の結果がレジスタに置かれるかスタックにプッシュされます。
関数は integer 型の結果をレジスタ %o0 に返します。float 型の結果はレジスタ %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 は構造体と同様に渡されます。
前述のレジスタは、呼び出し側から見えます。
すべての整数の引数は、8 バイト値として引き渡されます。
浮動小数点引数は可能なかぎり、浮動小数点レジスタに渡されます。
Intel 386 psABI および AMD64 psABI を遵守しています。
関数は次のレジスタで結果を返します。
表 F-21 型を返すために x86 関数が使用するレジスタ (-m32)
|
詳細は、http://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 の余分な引数を除き、スタックから引数をポップするのは呼び出し側の責任です。