引数には,レジスタで渡すものとスタックで渡すものがあります。各引数をどちらで渡すのかは,以下の手順を実施することにより決定されます。
サイズが4 の倍数でない構造体や共用体の場合,引数同士の間にパディング(図のグレー部分)ができ,この部分は内容が不定となります。
例の「これ以降は可変個数分の領域」では,実引数で設定する個数分だけメモリを消費します。
rtnで,ST4 の戻り値を書き込む場所のアドレスを渡します。
スタックで渡す引数をスタックへ設定する場合は,メモリ・イメージの右側から左側にかけてという順番でスタックへ格納されます。そのため,メモリ・イメージの16バイト・ オフセット位置のワードデータが,最も0に近い位置へ配置されます。 |
スタックへの配置の方法は,「9.1.4 スタック・フレーム」を参照してください。 |
構造体(ここでは“ST16”)が一部分しかレジスタに設定できなくても,かまわずレジスタで渡します。
可変個数であっても,レジスタが使用できる場合はレジスタで受け渡しします。
char型の引数4個を渡すだけでも,戻り値によっては,4番目の引数がスタック渡しとなる場合があります。
4バイト未満のサイズのスカラ型の場合,4バイトに拡張したデータをr10へと設定します。
戻り値の型が, 符号なしであればゼロ拡張, 符号有りであれば符号拡張します。
r10 には下位32ビット,r11 には上位32ビットを設定します。
戻り値が構造体や共用体の場合,呼び出し側は関数呼び出し時に,引数レジスタr6へ戻り値データを書き込む領域のアドレスを設定します。呼び出される側は,パラメータ・レジスタr6で指示されるアドレス位置に戻り値を設定し,呼び出し側関数へと返却します。
返却した時点では,呼び出し側の関数にとっては,r6もr10も不定(他の関数呼び出し前後で内容が保証されないレジスタと同じ)となります。
構造体や共用体は,サイズによらずすべて同じ返却方法となります。構造体や共用体のデータ自体をレジスタに設定して返却することはしません。