引数に対する一般的な規則と、引数の割り付け方について述べます。
引数が実際どのように割り付けられるかは、「9.1.5 引数割り付けの具体例」を参照ください。
引数の値を、必ずレジスタまたはスタック上の引数の割り付け領域にコピーしたあとで関数を呼び出します。呼び出した側の関数では、リターン後に引数の割り付け領域を参照することはありませんので、呼び出された側の関数で引数の値を変更しても呼び出した側の処理は直接には影響を受けません。
引数は、レジスタに割り付ける場合とスタック上の引数領域に割り付ける場合があります。引数の割り付け領域を図 9.2に示します。
通常、ソースプログラムにおける引数の宣言順に、番号の小さいレジスタから順に割り付けを行い、レジスタが全て割り付いたらスタックに割り付けます。但し、可変個の引数を持つ関数など、レジスタが余っていてもスタックに割り付ける場合もあります。また、C++プログラムの非静的関数メンバのthisポインタは、常にR1に割り付けられます。
引数割り付け領域の一般規則を表 9.2に示します。
関数原型により可変個の引数をもつ関数として宣言している場合、宣言の中で対応する型のない引数およびその直前の引数はスタック渡しになります。型のない引数は、2バイト以下の整数はlong型に、float型はdouble型にそれぞれ変換して、全て境界調整数が4の引数として取り扱います。 |
表 9.2で、スタック渡しとなる引数の、配置アドレス、およびスタックへの配置の仕方は以下となります。