Visual Fortran と MASM の位置合わせと戻り値に関する注意事項

Visual Fortran では,すべてのデータ・オブジェクトについて位置合わせを指定することができます。位置合わせを要求すると,オブジェクトとそのデータが自然境界から始まるように,充填のためのバイトが追加されます (「データの位置合わせの注意事項」を参照)。MASM の基本設定はバイト境界なので,MASM の構造体に対しては 4 の位置合わせを指定するか,Fortran コンパイラ・オプション /alignment:keyword (または /Zpn) を使用する必要があります。

MASM 手続は,関数としてプロトタイプされている場合,Fortran ルーチンに値を返すことができます。4 バイト以下の戻り値は (浮動小数点値を除いて) すべて EAX レジスタにいれて返されます。

浮動小数点値を返す手続は,結果を浮動小数点プロセッサー・スタックに格納して返します。これが可能なのは,32 ビット・コンパイラではつねにコプロセッサーまたはエミュレータが使用可能だからです。

機械語から Fortran に,REALCOMPLEX の浮動小数点値,記録,配列,および 4 バイトよりも大きい値を返す場合と,8 バイトよりも大きいユーザー定義型を返す場合,特殊な規約を使用する必要があります。Fortran は,スタック・セグメントに実際の戻り値を保持するための空間を作成し,スタックにプッシュされる最後のパラメタとして余分なパラメタを渡します。この余分なパラメタは,戻り値を含んでいるスタック空間のアドレスを含んでいます。ユーザー定義型の場合,4 バイト以下の値は EAX に,5 ~ 8 バイトの値は EAX:EDX に入れて返されます。

機械語手続では,戻り値オフセットがポイントする位置に,戻り値のデータを格納します。その後,戻り値オフセット (機械語コードでスタック・フレームを作成した場合,EBP+8 の位置にあります) を EAX にコピーします。これが必要なのは,呼び出し側モジュールが,EAX が戻り値を指していると期待しているからです。

次表に,値を返す方法を要約します。

Visual Fortran と MASM の位置合わせで値を返す方法

戻り値の型 値を返す方法
整数,論理型変数,または 4 バイト以下のユーザー定義型 EAX レジスタにいれて値を返します。
浮動小数点変数 FPU スタックに格納して値を返します。
4 バイト以上の変数 (文字,複素数),または 8 バイト以上のユーザー定義型 値をスタックに格納し,値のアドレスを EAX レジスタにいれて返します。
5 ~ 8 バイトのユーザー定義構造体 EAX:EDX レジスタに入れて値を返します。