关于内联汇编的几个技巧
来源:互联网 发布:货运车辆调度软件 编辑:程序博客网 时间:2024/06/04 20:13
1. 内联汇编嵌入VC语句:
在VC中内联汇编非常方便,只需要按照如下格式
__asm{
在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,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寄存器等,这些视具体情况而定。
由使用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++高手,同时还得是汇编高手。不过据我所知这种人十有八九是黑客。我是不鼓励你成为那类人的,撰写此文只为抛砖引玉。
- 关于内联汇编的几个技巧
- 关于内联汇编的几个技巧
- 关于内联汇编的问题
- 关于内联汇编的效率
- GCC扩展内联汇编关于寄存器的一点问题
- 关于汇编 段 大小的几个困惑
- 关于远程桌面的几个技巧
- 关于nmap的几个技巧
- 关于nmap的几个技巧
- 关于HTML的几个技巧
- 内联汇编的快速CRC32
- 简单的内联汇编 __asm
- 内联汇编和汇编指令的说明
- 内联汇编
- 内联汇编
- 内联汇编
- 内联汇编
- 内联汇编
- 一些背包问题
- .net4.0 对3.5的兼容性问题
- dom节点操作1
- 字符串操作(2)
- 百度知道发布iPhone应用
- 关于内联汇编的几个技巧
- 商业模式和赚钱的艺术
- 使用sockopt与内核交换数据
- 宋利兴_笔记_ServletConfig和ServletContext
- 在ubuntu-11.04上安装和配置tftpd
- 使用const的一些建议
- 图解苹果iOS 5的24个秘密功能(图)
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
- [转]解决/dev/fb0无法打开的问题