EAXを最初の引数として使用する呼び出し規約を使用するコンパイラは、スタックにプッシュしますか?


1

私は最近質問しました:How can an IA-32 program seemingly compiled with MSVC send its sole argument via EAX?質問を投稿した後、別の関数がEAXの最初の引数を渡し、残りの引数をプッシュしていることがわかりました。呼び出し元はスタックをクリーンアップします。

呼び出しコード:

.text:00402465     lea  eax, [ebp+var_4] 
    ... 
.text:00402469     push eax 
.text:0040246A     mov  eax, [ebp+hWnd] 
.text:0040246D     call openFileDialog 
.text:00402472     add  esp, 4 

と機能自体:

.text:00411730 openFileDialog proc near 
.text:00411730 
    ... 
.text:00411730 arg_0   = dword ptr 8 
.text:00411730 
.text:00411730     push ebp 
.text:00411731     mov  ebp, esp 
.text:00411733     sub  esp, 18h 
.text:00411736     cmp  byte_42AE1D, FALSE 
.text:0041173D     push ebx 
.text:0041173E     push esi 
.text:0041173F     push edi 
.text:00411740     mov  esi, eax 
    ... 
.text:00411789     mov  eax, [ebp+arg_0] 
.text:0041178C     push eax 
.text:0041178D     push esi 
.text:0041178E     call openFileDialog_Compat 
.text:00411793     add  esp, 8 

あなたが見ることができるように何がそれに影響を与えることができる前に、関数の中で、EAXの値は、保存されているので間違いなくパラメータとして使用されています。その後、プッシュされた引数は通常の__cdecl関数に渡されます。

Visual C++でコンパイルさが、この異例の呼び出し規約が私を作るされているように思われるので、プログラムは、msvcr100.dllを使用するようにリンクされ、(そのようななど__security_cookie、MSVCの名前の符号化、など)を通じてMSVCのスタイルを使用しています質問してください。

+3

「全体プログラムの最適化」を使用する場合、コンパイラは、内部リンケージを持つ関数に適した任意の呼び出し規約を使用できます。 06 12月. 172017-12-06 08:10:28

6

これはおそらく、「プログラム全体最適化」または「リンク時コード生成」でコンパイルされたプログラムです。 From MSDN

/LTCGは/ Ogを、/ O1、/ O2、または /牛でコンパイルされたモジュールをリンクするために使用される場合、以下の最適化が実行される。

  • クロスモジュール
  • をインライン
  • プロシージャー間のレジスタ割り付け(64ビットオペレーティングシステムのみ)

  • カスタム呼び出し規約(x86の場合のみ)

  • 小TLS変位(のみのx86)

  • スタック二重アライメント(のみのx86)

  • 改良されたメモリの一義化(グローバル変数および入力パラメータのためのより良い干渉情報)

  0

ありがとうございます。これは私が以前に遭遇したことのないものです。私は、コンパイラの観点と記述された標準から考えたことがあります。 07 12月. 172017-12-07 01:10:22


0

チェックCalling Conventionsまだmsvcサポート。 関数名openFileDialogについては、それはc#funcですか? C#とC++を組み合わせる CLR経由で??奇妙なことが起こるかもしれません。 MSはこれらの詳細を公に公開する必要はない。