您的位置:首页 > 其它

汇编呼叫函数的调用方法

2011-09-22 19:41 573 查看
用汇编呼叫函数的样例,大家要注意的是呼叫后恢复堆栈(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个参数的函数

void CallFunc2(LPVOID lpFunc,DWORD param1,DWORD param2)

{

__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);

}

//这里启动调用

void OnBnClickedOk()

{

// 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);



}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: