使用高级语言的时候,在编译的过程中,编译器会替你做很多事情,
要把你的函数里加好多东西,
但是有时候,我们不希望编译器自作主张的去加那么多东西。
怎么办呢,我们可以用“裸体”(
__declspec(naked))函数,灭哈哈,鼻血都流出来了,
顾名思义,在函数前面声明这个的意思就是不让编译器自作主张的在我们的函数里面加东西,
但是,有一点就是,里面的所有东西都要自己处理了,包括堆栈的平衡……
=。=!对于我们这些初学者比较恐怖,
一般来说,我们是不会用到这个声明的,但是做坏事除外。
好了我们大体上有个概念了,不如我们再列出代码,更形象一些:
int add ( int a, int b )
{
return a + b;
}
// 有压栈,又要有出栈,这样才能使堆栈平衡。
__declspec(naked)add2( int a, int b )
{
__asm
{
push ebp
mov ebp,esp
push [ebp + 0ch]
push [ebp + 8h]
call add
mov edx, [ebp + 8h]
pop edx
mov edx, [ebp + 0ch]
pop edx
mov esp, ebp
pop ebp
ret 0x8
}
}
|
这只是一个简单的例子,为了说明“裸体”函数的应用。调用add2就像调用普通函数一样就OK了。
阅读(1332) | 评论(0) | 转发(0) |