关于内联汇编的几个技巧

2016-01-29 12:18 28 1 收藏

关于内联汇编的几个技巧,关于内联汇编的几个技巧

【 tulaoshi.com - C语言心得技巧 】

关于内联汇编的几个技巧
       作者:孙原

下载本文示例代码
       
       有时我们的程序需要一些很高的执行效率或者执行系统底层的功能模块,这些关键的部分我们可以采用内联汇编直接插入汇编指令来达到我们的要求,以下是几个技巧与大家共同探讨.
       
        1. 内联汇编嵌入VC语句:
       
       在VC中内联汇编非常方便,只需要按照如下格式
       __asm{

//汇编语句

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

}
       
       请看如下示例代码

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
void CAlcmemDlg::OnButton3() {DWORD d=(m_size*1024*1024)/sizeof(DWORD);DWORD*p=(DWORD*)m_p;DWORD s;m_pr.SetMin(0);m_pr.SetMax((float)d);m_pr.SetEnabled(TRUE);if(NULL!=m_p){__asm{mov ecx,dmov eax,0L:mov edx,DWORD ptr pmov [edx+eax],1//随便写入数据,此处写入1inc eaxmov s,eaxpushad}m_pr.SetValue((float)s);__asm{popadloop L}}}

     请注意示例代码中两个__asm块中的pushad 和 popad 语句,pushad保存了寄存器环境,popad恢复了寄存器环境,使得m_pr.SetValue((float)s);语句对寄存器的影响被抵销,你还可以调用其他任何语句。但建议是尽量少打断内联汇编块,以减少运行时来回倒腾寄存器环境的时间。笔者的测试是,当删除m_pr.SetValue((float)s);并且合并两个__asm块,同时删除pushad,和popad后,速度明显提高。可见这种打断通常是得不偿失。
     通常要保存的寄存器环境还有Flags寄存器等,这些视具体情况而定。
     
      2. 自由使用FPU,MMX等指令

void CAlcmemDlg::OnButton4() {float f_t=.132;float f_s=0;__asm{fld f_sfld f_sfld f_sfld f_tfadd f_tfst f_t//fadd fs}}

     可以利用设置断点的方法来观察FPU寄存器的情况,通常你用VC写的代码,不会被编译为引用特殊指令集的代码,虽然微软号称编译器支持这些指令。所以你必须用内联汇编方法来调用这些指令以优化程序,充分利用资源。示例中的代码调用了FPU处理器的指令,使操作浮点数的能力被充分发挥。但当然你还可以调用3DNOW!指令,SSE,SSE2等指令,但笔者没有试过,如果你有什么新的发现,还望赐教,再此先谢了!
     总的来说内联汇编提高了速度,尤其是游戏编程,更应该努力使用内联汇编,把CPU充分榨干,但坏处就是有些低端的机器无法运行,兼容性差。同时微软又号称,编译器不会去优化你写的汇编码,他只是简单的翻译为等价的机器码,优化的事情交给你自己来完成,所以你不但得是C++高手,同时还得是汇编高手。不过据我所知这种人十有八九是黑客。我是不鼓励你成为那类人的,撰写此文只为抛砖引玉。
     
     作者信息:
     姓名:孙原(2002-8-16于西安)
     E-mail:rock.sun@163.net
     QQ:41750362

来源:http://www.tulaoshi.com/n/20160129/1485460.html

延伸阅读
在c++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,非凡的引入了inline修饰符,表示为内联涵数。 !-- frame contents -- !-- /frame contents -- 可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频...
胎教给孩子听的到底是什么 感官何其多?为什么首重“听觉”?因为耳朵大概是出生前胎儿发展最重要的部份,它不但是听力的窗口,也是控制身体平衡和协调的重要器官,所以任何对胎儿有好处的声音刺激,都可以激发胎儿的聆听和沟通的动力。 近年来由于医学界对胎儿成长的研究,让我们知道胎儿在母亲的肚子里时已经发展了各种感官能力,比如说听...
宝宝断奶后最常见的5个问题   1. 宝宝 断奶了但奶瘾难断怎么办 奶瘾是宝宝的异常进食行为,属于非生理需要,即不管宝宝饿不饿都想要吮吸宝宝乳头,如果不满足他就开始哭闹。妈妈需要慢慢帮助宝宝戒掉奶瘾,当宝宝想要吮吸奶头时,可以转移宝宝的注意力,让宝宝的兴趣转到其他方面比如玩玩具、做游戏...
标签: 瘦身
经期减肥误区有哪些 经期是女性生理周期中减肥的最佳时期,如何抓住这短暂的黄金时期进行有效的瘦身呢?经期减肥可以做到事半功倍,但是如何在这期间提高减肥效率,经期减肥也有误区,千万不要走进这些减肥误区。 1.经期剧烈运动 在月经期间女性是不能剧烈运动的,特别是引起腹压增高的运动,像是长跑、跳绳、仰卧起坐这些运动都是要避免的...
有些不含活性菌的产品也会在标签上生成含有益生菌,或者标注的益生菌含量比实际要高。2013年,独立调查机构所做的调查发现19种益生菌营养品中,有5种实际含有的微生物比声称的要少。有些产品的益生菌含量仅有成分表上的56%,最少的只有表上声称的16%。 有关于益生菌的几个认识误区 有关于益生菌的几个认识误区 食物和营...

经验教程

698

收藏

33
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部