naked 函数调用

Posted on 2006-10-28 20:02 紫雨轩 C++ 阅读(3028) 评论(13)  编辑 收藏 引用 所属分类: C++基础

正常的情况下,我们写一个 C/C++ 函数,即使是一个空函数,编译器也为我们做了不少的工作,生成了一些“必要”的代码。请看下面的函数 (为了说明问题随便写的):


int Test()
{
    int iReturn;
    char szTemp[33];
   
    szTemp[0] = 'A';
    szTemp[1] = '';
    iReturn = MessageBox(NULL, szTemp, szTemp, MB_OK);
    MessageBeep(iReturn);
    return iReturn;
 }

下面是用 VC6 在 Release 方式下编译后的的反汇编代码:


00401000   sub         esp,24h     // 增加堆栈空间存放局部变量 (24H = 36D,4 字节对齐,注意这里没有为 iReturn 分配空间)
00401003   push        esi         // 保存要使用的重要寄存器
00401004   lea         eax,[esp+4] // 下面是传递 MessageBox() 要使用的参数
00401008   push        0
0040100A   lea         ecx,[esp+8] // 编译器愚蠢,根本不用 ECX,两个都是 szTemp,两次 PUSH EAX 不得了
0040100E   push        eax
0040100F   push        ecx
00401010   push        0
00401012   mov         byte ptr [esp+14h],41h
00401017   mov         byte ptr [esp+15h],0
0040101C   call        dword ptr ds:[40509Ch] // 调用 MessageBox()
00401022   mov         esi,eax     // 保存返回值到变量 iReturn 。靠!变量 iReturn 自动使用 ESI,编译器太聪明了:)
00401024   push        esi
00401025   call        dword ptr ds:[4050A0h] // 调用 MessageBeep()
0040102B   mov         eax,esi     // 把变量 iReturn 交给 EAX 作为返回值
0040102D   pop         esi         // 恢复要使用的重要寄存器
0040102E   add         esp,24h     // 减少堆栈空间
00401031   ret                     // 堆栈长度减 4 并返回


这段代码虽然很精干 (都能自动使用寄存器来保存变量了),但是有的时候我们并不需要编译器提供这些自作主张的代码 (比如写驱动程序的时候,不过我还没遇到过这种情况,呵呵~~),我们希望整个全部函数都是自己亲手写进去的 (BT 呀^o^)。好,请出今天的主角 —— “naked”(怎么是裸体呀?),欢迎!Visual C++ 的扩展关键字 naked 允许我们完全定制一个函数,废话不说了,看例子 (熬夜写的 Zzzzzz~~):


__declspec(naked) int Test()
{
    __asm
    {
        SUB         ESP,24H
        PUSH        ESI
        LEA         EAX,[ESP+4]
        PUSH        0                      
        PUSH        EAX                    
        PUSH        EAX                    
        PUSH        0                      
        MOV         BYTE PTR [ESP+14H],41H
        MOV         BYTE PTR [ESP+15H],0  
        CALL        DWORD PTR [MessageBoxA]
        MOV         ESI,EAX
        PUSH        ESI                    
        CALL        DWORD PTR [MessageBeep]
        MOV         EAX,ESI
        POP         ESI
        ADD         ESP,24H
        RET
     }
 }

上面的代码是使用的 VC 的内联汇编,和 VC 编译后生成的代码完全是一样的 (很有完全控制的成就感吧^_^)。上面我们并没有又节省什么 (节省的 PUSH ECX 并不是 naked 的功劳),但是有的时候确实需要的 (举不出例子来了,倒!)。最后随便说说注意事项:

1.使用 naked 关键字需要自己构建 EBP 参数指针 (如果用到了 EBP 作为参数指针的话);
2.必须自己使用 RET 或 RET n 指令返回 (除非你不返回)。

Feedback

# re: naked 函数调用   回复  更多评论   

2008-03-19 13:55 by DDD
<a href="http://www.topowerleveling.com">world of warcraft power leveling</a> <a href="http://www.topowerleveling.com">wow power leveling</a> <a href="http://www.topowerleveling.com">power leveling</a> <a href="http://www.mmosgames.com">runescape gold</a> <a href="http://www.mmosgames.com">rs2 gold</a> <a href="http://www.mmosgames.com/indexeu.asp">Lord of the Rings Online Gold</a> <a href="http://www.gowowpowerleveling.com">wow">http://www.gowowpowerleveling.com">wow gold</a> <a href="http://www.mmmqt.cn">中国福利彩票</a> <a href="http://www.ac021.com/x2-4.htm">稳压器</a> <a href="http://www.ac021.com">直流电源</a> <a href="http://www.jhking.net">安检门</a> <a href="http://www.mmmqt.cn">福彩3d</a>

<a href="http://www.kintochina.cn">flexible connectors</a> <a href="http://www.gowowpowerleveling.com">power leveling</a> <a href="http://www.gowowpowerleveling.com">wow">http://www.gowowpowerleveling.com">wow power leveling</a> <a href="http://www.gowowpowerleveling.com">world of warcraft power leveling</a> <a href="http://www.cardel.cn">briefcase</a> <a href="http://www.plastic-thermoforming-machine.com/product.htm">Thermoforming Machine</a> <a href="http://www.wzboty.cn">气动马达</a> <a href="http://www.wzboty.cn">气动搅拌机</a> <a href="http://www.rarixin.cn">密炼机</a> <a href="http://www.3721.cn">包装机械</a> <a href="http://www.shangrun.com">上润</a>

# re: naked 函数调用   回复  更多评论   

2009-03-13 01:57 by 中国福利彩票
中国福利彩票 www.0008cpw.cn

中国福利彩票3D www.cp291.cn

双色球开奖 www.3d718.cn

3D开奖 www.98429.com

财政部彩票网 www.92097.com

双色球走势图 zgcpw888.cn

双色球 www.3d-gov.cn

# re: naked 函数调用   回复  更多评论   

2009-05-11 00:37 by 中国福利彩票
中国福利彩票官方网www.92097.com-该网站在4月27日就应该退还我交的会员费1280元。4月28月是该网站办理退款的最后区限。我4月26日打电问;‘我的钱什么时退’、那个懂先生还说;‘我近快帮你安排好通知你。’我也答应了。我等了2天,也就是4月30日都没有他们的消息。我又打电话,这时就没有人接听电话了。他们银行帐户名是;王志平。联系电话;010-60877248手机13439357740-客户服务;朱勇,王帅凌。还是国家维一指定网站。我希望知道这个网站消息的人,和管理单位帮擦一下,有消息请根我联系。联系电话-13887305227我姓蒋。我想我是被骗了、、、、、、、希望大家给我帮助,本人万分感谢、、、、、、。

# re: naked 函数调用   回复  更多评论   

2009-05-11 01:02 by 中国福利彩票
@中国福利彩票www.92097.com擦找

# re: naked 函数调用   回复  更多评论   

2009-05-11 15:06 by 中国福利彩票
我想问;www.92097.com网站是不是已经改为-www.97716.com。这个www.97716.com是不是才更新的

# re: naked 函数调用   回复  更多评论   

2009-05-15 11:23 by 中国福利彩票
www.97716.com网站就是www.72097.com网站。他们的银行户头的名字都是王志平的。但是今天www.97716.com网站的银行户头名字又改换成万海华的了。换汤不换药。

# re: naked 函数调用   回复  更多评论   

2010-03-19 06:17 by ToniaPierce23
I had a desire to begin my business, however I did not have enough amount of money to do that. Thank goodness my friend advised to take the <a href="http://lowest-rate-loans.com/topics/credit-loans">credit loans</a>. Hence I took the short term loan and realized my old dream.

# re: naked 函数调用   回复  更多评论   

2010-07-21 04:27 by buy resume
People count on our
resume service cause they are the most trustworthy! Our company makes resume writer to fit the precise area of science you wish.

# re: naked 函数调用   回复  更多评论   

2012-01-12 08:54 by thesis writing
With the goal to forestall the errors in some dissertation discussion, that would be the best to order the really good story related to this good topic at the buy dissertation service in Internet. That is easier to have the good grades going this way.

# re: naked 函数调用   回复  更多评论   

2012-01-24 06:59 by buy an essay
It's not so easy to make a not bad already written essays, especially if you are booked. I consult you to define buy essay and to be spare from scruple that your work will be done by writing services

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


posts - 18, comments - 22, trackbacks - 0, articles - 7

Copyright © 紫雨轩 C++