naked 函数

vc 提供了一种叫做naked函数的声明。naked意思为赤裸的意思,需要程序员管理堆栈,退出时需要显示调用ret,以及平衡堆栈。

当然带来的好处是免去了编译器默认为我们做的那些不必要的工作(很多费代码)。

 

以下是一个简单的naked函数的例子

 

 

#include using namespace std; int __declspec(naked) add(int x,int y) { __asm { push ebp mov ebp,esp mov eax,dword ptr [ ebp+8 ] add eax,dword ptr [ ebp+0xc ] pop ebp ret } } int _tmain(int argc, _TCHAR* argv[]) { cerr<

 

 naked 函数默认为__cdecl调用,需要调用者平衡堆栈(如果使用call调用时)。

 

 #include char fmt[] = "%d/n"; int __declspec(naked) __cdecl sum(int x,int y) { __asm { push ebp mov ebp,esp mov eax,dword ptr [ ebp+8 ] add eax,dword ptr [ ebp+0xc ] pop ebp ret } } int __declspec(naked) _tmain(int argc, _TCHAR* argv[]) { __asm { push 5 push 6 call dword ptr [sum] add esp,8 push eax lea eax,fmt push eax call dword ptr [printf] add esp,8 ret } }

 

在调用sum函数后,需要将esp加上8(两个dword的长度)。

 

另外注意的是,调用C函数是,不能直接使用call printf,而需要使用 call dword ptr[printf]

 

你可能感兴趣的:(学习随记)