3

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、プログラムは想定どおりに動作します。それで、私の質問は...コンパイラにこれらの命令の追加を強制的に停止させる方法はありますか?

ありがとう。

4

1 に答える 1

5

問題は次のとおり, ...)です。

可変数の引数を持つ関数は にすることはできません__stdcall

__stdcall関数は最後にスタックからすべてのスタック引数を削除する必要がありますが、パラメーターとして受け取るものを事前に知ることはできません。

関数についても同様__fastcallです。

可変数の引数を持つ関数の唯一の適用可能な呼び出し規約は__cdecl、呼び出し元が呼び出し後にスタック パラメーターを削除する必要がある場合です。そして、それはあなたの要求にもかかわらず、コンパイラが使用するもの__stdcallです.

于 2012-08-06T19:10:10.400 に答える