汇编呼叫函数的调用方法
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);
}
//呼叫无参数的函数
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);
}
相关文章推荐
- GCC&&G++ C && C++ 内嵌汇编和调用汇编函数的方法(x86,ARM自己对照改)
- 编写c51程序调用汇编函数的一种方法
- Linux下NASM汇编函数和C语言函数相互调用的方法
- 为何汇编里调用C函数需要堆栈,而汇编语言的函数的调用却不需要堆栈
- 获取类成员函数地址和调用的方法
- eclipse中查看某个方法(函数)被谁调用
- go语言使用go-sciter创建桌面应用(三) 事件处理,函数与方法定义,go与tiscript之间相互调用
- 关于JS中setTimeout()无法调用带参函数问题的解决方法
- JavaScript子窗口调用父窗口变量和函数的方法
- js 函数的方法 函数调用模式 this => that arguments
- 调用未绑定的父类方法和使用supper 函数 之间的选择.
- iframe里面的页面调用父窗口,左右窗口js函数的方法
- python 函数是可调用对象和特殊方法__call__
- WIN32汇编-子程序(方法或函数)
- Android使用ksoap2调用C#中的webservice函数方法
- 在FORTRAN的过程和函数中调用C++函数的方法
- Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
- 函数指针初始化和调用的几种方法
- 写一方法计算实现任意个整数之和.在主调函数中调用该函数,实现任意个数之和。(使用params参数)