关于内联汇编的几个能力
有时我们的措施需要一些很高的执行效率可能执行系统底层的成果模块,这些要害的部门我们可以回收内联汇编直接插入汇编指令来到达我们的要求,以下是几个能力与各人配合探讨.
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++好手,同时还得是汇编好手。不外据我所知这种人十有八九是黑客。我是不勉励你成为那类人的,撰写此文只为抛砖引玉。
本文配套源码