Win32/Win64での呼び出し規約

Visual C/C++での呼び出し規約(calling convention)をまとめておきます。

(本記事の初稿は2004年です。64ビットCPUが普及した現在でも有用な内容と思われるので、そのままの内容で公開します。)

■__cdecl, __fastcall, __stdcall

引数の渡し方:スタック経由のみ
スタックへの積み方:Right to Left
スタックに積まれた引数の除去:関数を呼び出した側で行う。
引数の渡し方:(左側から)最初の2つはECX, EDX経由、残りはスタック経由
スタックへの積み方:Right to Left
スタックに積まれた引数の除去:関数を呼び出された側で行う。
引数の渡し方:スタック経由のみ
スタックへの積み方:Right to Left
スタックに積まれた引数の除去:関数を呼び出された側で行う。
注:WIN32 APIを呼び出すときに使う呼び出し規約。

■その他

■あまり使わなさそうなもの
__clrcall
__thiscall
naked(__naked)         (関数の入口・出口での引数処理コードが生成されなくなる。VxDで使うらしい。)

■かつて使われていたもの
__pascal
__fortran
__syscall

起草日:2004年10月11日(月)(www.marbacka.net内の別のサイトで公開)
最終更新日:2017年2月19日(日)

スポンサーリンク
error: Content is protected !!