VC与汇编的联合,转自http://www.fortime.net/article.php/61
来源:互联网 发布:南山 科技园 知乎 编辑:程序博客网 时间:2024/05/16 13:51
有时我们的程序需要一些很高的执行效率或者执行系统底层的功能模块,这些关键的部分我们可以采用内联汇编直接插入汇编指令来达到我们的要求,以下是几个技巧与大家共同探讨.
1. 内联汇编嵌入VC语句:
在VC中内联汇编非常方便,只需要按照如下格式
__asm{
//汇编语句
}
请看如下示例代码
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,d
mov eax,0
L: mov edx,DWORD ptr p
mov [edx+eax],1 //随便写入数据,此处写入1
inc eax
mov s,eax
pushad
}
m_pr.SetValue((float)s);
__asm{
popad
loop 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_s
fld f_s
fld f_s
fld f_t
fadd f_t
fst f_t
// fadd fs
}
}
可以利用设置断点的方法来观察FPU寄存器的情况,通常你用VC写的代码,不会被编译为引用特殊指令集的代码,虽然微软号称编译器支持这些指令。所以你必须用内联汇编方法来调用这些指令以优化程序,充分利用资源。示例中的代码调用了FPU处理器的指令,使操作浮点数的能力被充分发挥。但当然你还可以调用3DNOW!指令,SSE,SSE2等指令,但笔者没有试过,如果你有什么新的发现,还望赐教,再此先谢了!
总的来说内联汇编提高了速度,尤其是游戏编程,更应该努力使用内联汇编,把CPU充分榨干,但坏处就是有些低端的机器无法运行,兼容性差。同时微软又号称,编译器不会去优化你写的汇编码,他只是简单的翻译为等价的机器码,优化的事情交给你自己来完成,所以你不但得是C++高手,同时还得是汇编高手。不过据我所知这种人十有八九是黑客。我是不鼓励你成为那类人的,撰写此文只为抛砖引玉。
- VC与汇编的联合,转自http://www.fortime.net/article.php/61
- String的==与equal和null( 转自:http://www.jb51.net/article/18417.htm)
- ASP.NET操作EXCEL的总结篇(转自http://www.jb51.net/article/26273.htm)
- LInux下常用压缩格式的解压和压缩(转自http://www.21ds.net/article/31/369)
- python字符串连接的N种方式(转自http://www.jb51.net/article/55301.htm;http://www.cnblogs.com/huangcong/)
- 转载自http://www.xuanxi.net/Article/Catalog6/10748.html的C#写邮件发送程序
- 如何使用VS写单元测试(转自:http://www.51crazy.net/Article/216.aspx)
- 转自:http://www.ixdba.net/article/34/272$1.html
- 转自 http://www.csdn.net/article/2012-10-12/2810710-VM_cloudcomputing_opensource 云计算几个概念
- javascript:深入理解闭包——转自http://www.jb51.net/article/24101.htm
- jquery实现textarea 高度自适应 转自http://www.jb51.net/article/61997.htm
- dependencies与dependencyManagement的区(转自:http://blog.csdn.net/liutengteng130/article/details/46991829)
- 浅析c与c++中struct的区别 http://www.jb51.net/article/39992.htm
- windows编程基础概述(转帖自:http://www.bccn.net/Article/kfyy/cjj/jszl/200412/429.html)
- WebConfirm控件(转自http://www.evget.com/view/article/viewArticle.asp?article=961)
- WebConfirm控件(转自http://www.evget.com/view/article/viewArticle.asp?article=961)
- IDR(刷新帧)与I帧的一些知识点 转自:http://blog.csdn.net/zhoujunming/article/details/6734988
- 转http://www.jb51.net/article/67718.htm从键盘输入字符的方法
- 星光灿烂之夜-MVP SuperStar
- 杂谈:我的25年嵌入式生涯 文/周立功
- 程序员的灯下黑:坚持和良好心态近乎道
- “Web开发之华山论剑”制作花絮与推荐导读
- SQL自动生成日期加数字的序列号
- VC与汇编的联合,转自http://www.fortime.net/article.php/61
- 刚刚从新疆回来
- Java多线程程序设计详细解析(转)
- 取得文件夹大小
- 关于synchronized
- 看看我的房间(我奋斗的地方 南北战争就是在这里酝酿的....)
- 暴走之前
- 无用
- Rod和Ted,Don之间关于EJB和Spring的讨论(二)