<b>关于内联汇编的几个本领</b>[VC/C++编程]
本文“<b>关于内联汇编的几个本领</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
有时我们的程序需求一些很高的履行效率大概履行系统底层的功效模块,这些关键的部份我们可以采取内联汇编直接插入汇编指令来到达我们的要求,以下是几个本领与大家共同探究.
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++高手,同时还得是汇编高手.不过据我所知这种人十有八九是黑客.我是不鼓舞你成为那类人的,撰写此文只为举一反三.
以上是“<b>关于内联汇编的几个本领</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |