2011-09-13 15 views
0

にASM機能を呼び出します私はこれを必要とは思いませんがあなたは私が欠けていると思うどのような種類の機能のこれは..です__cdecl、__stdcall、または__thiscall</p> <p>求めることができる通常の関数</p> <p>.. C++でASM関数を呼​​び出すしようとするとC++

push ebp 
mov ebp, esp 

のようなものは、誰かが一度私に言ったが、私はので、私は同じ問題で立ち往生しています忘れてしまいました。私は通常、デバッガを接続してこれを修正しますが、私の場合はプログラムがデバッガを許可しません。

私はこの機能を持っている、それはこれが、私が試したものです

int testFuncAddr = 0x00421520; 
__declspec(naked) void Test(int buffer, int key) 
{ 
    __asm{ 
     push edx 
     push ecx 
     mov edx, key 
     mov ecx, buffer 
     call [testFuncAddr] 
     ret 
    } 
} 

が本当にに関することを何をするか分からないのです動作しませんでした

00458BDE  90    NOP 
00458BDF  90    NOP 
00458BE0 /$ 8B5424 04  MOV EDX,DWORD PTR SS:[ESP+4] 
00458BE4 |. 8B09   MOV ECX,DWORD PTR DS:[ECX] 
00458BE6 |. E8 3589FCFF CALL Continuu.00421520 
00458BEB \. C2 0400  RETN 4 
00458BEE  90    NOP 
00458BEF  90    NOP 

__thiscall機能ですそれを合計。

答えて

4

まず、あなたの関数は(EDXが使用される)__fastcallですので、これはあなたがCでそれをtypedefをすることができます意味:

typedef void (__fastcall * function_t)(int buffer, int key); 
function_t pfTheFunc = (function_t)0x00421520; 

あなたはその後、彼らはまた、揮発性である(push edxpush ecxが不要であることを気づくべきですしたがって、以前は使用されていなかったコードに電話をかけている場合を除いて、コール全体で保持する必要はありません。彼らは保存する場所ならばと、彼らはまた、pop

__declspec(naked) void Test(int buffer, int key) 
{ 
    __asm{ 
     push edx 
     push ecx 
     mov edx, key 
     mov ecx, buffer 
     call [testFuncAddr] 
     pop ecx 
     pop edx 
     ret 
    } 
} 

のマッチングセット必要:ちょうどスタックフレームを作成します

push ebp 
mov ebp, esp 

をあなたが知っている限り、それは(実際の関数には、実際のビーイングを持っていませんバイナリはフレームポインタなしでコンパイルされました。この場合、非裸関数でのインラインアセンブリの使用を示しています)

+0

ありがとう私は物事を頻繁に忘れています。今は私のSOアカウントでこれを保持します。また、 'typedef関数' **は正しく動作します** ..しかし、アセンブリの同等物は動作しません、私はもはやそれを望んでいない..私は今、 'ret'もそこに属していないと思います。 mov movx、buffer' 'call [testFuncAddr]'はうまくいくはずですか?もし私が今思い出したのであれば、それが本当にうまくいっている 'pushad''popad'を本当に必要と思ったのですか? – SSpoke

+0

@SSpoke: 'mov edx、key';' mov ecx、buffer'; 'call [testFuncAddr]'; 'retn'(あなたは' CALL'の代わりに 'JMP'だけで、' RETN ')。その2番目のスニペットは正しいレジスタの保存を実証するだけでした(ただし、動作するはずです) – Necrolis

関連する問題