用汇编呼叫函数的样例,大家要注意的是呼叫后恢复堆栈(esp栈顶指针的值)现场的方法,没有恢复,或者恢复不正确,会有大大的error报出来!
//呼叫无参数的函数
DWORD dwRet;
void CallFunc0(LPVOID lpFunc){
__asm
{
call DWORD Ptr[lpFunc]
mov dwRet ,eax
//cmp ax ,1//[esp+4]
//call DWORD Ptr[lpFunc]
}
}
//呼叫一个参数的函数
void CallFunc1(LPVOID lpFunc,DWORD param1)
{
__asm
{
push param1
call DWORD Ptr[lpFunc]
add esp ,4 //恢复栈指针
mov dwRet ,eax
}
}
//呼叫2个参数的函数
{
__asm
{
push param1
push param2
call DWORD Ptr[lpFunc]
add esp ,8 //恢复栈指针
mov dwRet ,eax
}
}
//呼叫3个参数的函数
void CallFunc3(LPVOID lpFunc,DWORD param1,DWORD param2 ,DWORD param3)
{
__asm
{
push ax
call DWORD Ptr[lpFunc]
cmp ax ,[esp-4]
call DWORD Ptr[lpFunc]
mov dwRet ,eax
}
}
void func0()
{
::MessageBox(0,0,0,0);
}
void func1(LPCTSTR lpStr)
{
::MessageBox(0,lpStr,0,0);
}
void func2(LPCTSTR lpStr ,LPCTSTR lpStr2)
{
::MessageBox(0,lpStr,lpStr2,0);
}
//这里启动调用
{
// TODO: Add your control notification handler code here
dwRet = 0;
CallFunc0(func0);
LPCTSTR lp1 = _T("Call func1 called!~");
CallFunc1(func1,(DWORD)lp1);
LPCTSTR lp2 = _T("Call func2 called!~");
CallFunc2(func2,(DWORD)lp1,(DWORD)lp2);
}