2009年4月8日水曜日

cdecl 呼び出し規約

cdecl 関数呼び出し規約についてMSDNやVCが生成するコードを基に調べてみました。

引数

  • 引数は最後から順にスタックにpushされる。(4バイト境界)
  • 4バイト以上の構造体を引数に値渡しした場合でも、構造体の内容がそのままスタックに追加される。(4バイト境界でスタックに入れられる)
  • __m64 は3つまではmm0, mm1, mm2に渡される。4つ以上はコンパイルエラー。スタックにはpushされない。
  • __m128 は3つまではxmm0, xmm1, xmm2に渡される。4つ以上はコンパイルエラー。スタックにはpushされない。

戻り値
  • 整数型、1, 2, 4バイトの構造体はeaxに値として返される。
  • 8byteの構造体は上位32bitはedx、下位32bitはeax
  • float/double はFPU ST(0)に値として渡される。
  • __m64 はmm0に値として返される。
  • __m128 はxmm0に値として返される。
  • 上記以外は関数呼び出し時の最初の引数として戻り値のポインタを渡し、そのアドレスに戻り値の内容がコピーされる。eaxにはそのポインタが返される。
    第1引数が戻り値のポインタとなるため、関数の本来の引数は第2引数以降に渡される。

0 コメント:

  © Blogger template 'Isolation' by Ourblogtemplates.com 2008

Back to TOP