MSVS が関数の __stdcall ディレクティブを無視しているように思えます。スタックを手動でクリーンアップしていますが、コンパイラーは引き続きADD ESP
各 の後に命令を追加しますCALL
。
これは私が関数を宣言する方法です:
extern "C" void * __stdcall core_call(int addr, ...);
#define function(...) (DWORD WINAPI) core_call(12345, __VA_ARGS__)
return function("Hello", 789);
そして、これは出力がどのように見えるかです:
(ソース: server4u.cz )
ADD
スタックの消去は呼び出し先の責任であるという事実にもかかわらず、各呼び出しの後に MSVS が自動的に追加する冗長な命令を矢印でマークしました(参照: http://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions ) およびこれ私のプログラムのクラッシュを引き起こします。ADD
手動で命令をに置き換えるとNOPs
、プログラムは想定どおりに動作します。それで、私の質問は...コンパイラにこれらの命令の追加を強制的に停止させる方法はありますか?
ありがとう。