内联汇编的技巧
时间:2023-09-29 10:33来源: 作者: 点击: 次有时我们的程序需要一些很高的执行效率或者执行系统底层的功能模块,这些关键的部分我们可以采用直接插入指令来达到我们的要求,以下是几个与大家共同探讨.
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等指令