2016-04-25 9 views
-3

Windows ABIの32ビットからx86-64のasmにラッパー関数を移植しようとしています。この関数は、引数として配列としてインデックスを付けることに依存します。Windows x86-64の配列としてargsをインデックスするABI

私はMSVCがX64プロジェクトでインラインアセンブリを実行できないことを知っていますが、同等の機能をX64の.asmファイルに組み込むことに興味があります。

この関数は、呼び出されるAPIのスタックフレームを設定します。

__declspec(naked) PVOID WINAPIV CGX86(FARPROC lpPtr, UINT lpSize, ...) 
{ 
    __asm { 
     push ebp; 
     mov ebp, esp; 
     lea eax, [ ebp + 0x04 ]; 
     mov [ ebp - 0x04 ], eax; 
     mov eax, [ ebp - 0x04 ]; 
     mov ecx, [ ebp + 0x0C ]; 
     add ecx, 2; 
ParseArgs: 
     cmp ecx, 2; 
     jz short MoveFinal; 
     push dword ptr [ eax + ecx * 0x04 ]; 
     sub ecx, 1; 
     jmp short ParseArgs; 
MoveFinal: 
     call [ ebp + 0x08 ]; 
     mov esp, ebp; 
     pop ebp; 
     retn; 
    } 
} 

使用例:Cでそれを書くために

CGX86((FARPROC)MessageBoxA, 4, GetForegroundWindow(), "BODY", "TITLE", MB_OK); 
+2

「ヘルプ」とは、あなたが私たちにあなたのためにそれを書いてほしいということですか? – Jester

+0

残念ながら、これはX64で使用されている呼び出し規約が大きく異なるため、考えているより大きな作業です。最初から完全に書き直さなければならないだろう。 –

+2

@MichaelPetchもしあなたが言ったようにeaxが戻りアドレスを指していて、引数に1つのインデックスを使用するので、最後の引数は 'eax + 3 * 4'を与える' ecx = 3'でしょう。 'ebp + 16'。私は 'プッシュecx'の目的を理解していない。 – Jester

答えて

1

道化師の提案は、ESP、おそらく良いものです。 argsのいくつかがコンパイル時定数である呼び出しにインライン化できる場合。あなたの使用例は、関数ポインタを含む、コンパイル時定数のargをほとんど渡します。 適切な最適化コンパイラは、これをインラインにして、正しいargsを使って間接参照を通常の関数呼び出しに最適化します。定義をインライン化できる場所に置いてください。

しかし

、あなたは素敵なコードにするために、コンパイラを得ることができない場合:配列は、いくつかの64ビットABIに実装する方法非自明の機能の唯一の作品であるよう

インデックス引数をargsはregsにあります。

Windows 64ビット呼び出し規約では、スタックargs(シャドウスペース)のすぐ下に4つのレジスタargsを格納するためのスペースが用意されていますので、実際にの4つの命令それらのスロットへのargs)。最初の4つの引数を特別に扱う必要はありません。

発信argsをスタックの代わりにregsに入れて、あなたが呼び出した関数のシャドウスペースを残しておいてください。

Ross Ridgeが指摘するように、スタンドアロンasmにSEH巻き戻し情報を作成するための指示文を必ず含めてください。これは、純粋なC++ソリューションを優先するもう一つの理由です。 argの数が少数に制限されている場合

呼び出し規約などのリンクについては、タグwikiを参照してください。

I'm not a fan一般的にWindowsの呼び出し規約ですが、var-args関数の実装を単純化しています。私はそれがABIに「影の空間」が存在する理由だと確信しています。

+0

助けてくれてありがとう、私は今理解しています。 私はあなたに投票しました。ダニで、誰が投票したのか、なぜダウンしたのか分かりません。 – RaulFernando

+0

@RaulFernandoはあなたが間違ったボタンを押したように見えますが、あなたはダウンしていません(ただ1つの投票しかありません)。 – Jester

+0

@Jester:それはRaulのコメントの前にしばらく下降していた。そして、なぜ、これが*答えなのかを明確にするために編集した後で、ダウンボートは削除されます。 :) –

関連する問題