Chinaunix首页 | 论坛 | 博客

=.=

  • 博客访问: 139402
  • 博文数量: 50
  • 博客积分: 3000
  • 博客等级: 中校
  • 技术积分: 550
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-25 17:22
文章分类

全部博文(50)

文章存档

2010年(7)

2009年(43)

我的朋友

分类: C/C++

2010-01-11 09:37:45

使用高级语言的时候,在编译的过程中,编译器会替你做很多事情,

要把你的函数里加好多东西,

但是有时候,我们不希望编译器自作主张的去加那么多东西。

怎么办呢,我们可以用“裸体”(__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了。
阅读(1313) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~