內(nèi)聯(lián)匯編的技巧
有時(shí)我們的程序需要一些很高的執(zhí)行效率或者執(zhí)行系統(tǒng)底層的功能模塊,這些關(guān)鍵的部分我們可以采用內(nèi)聯(lián)匯編直接插入匯編指令來達(dá)到我們的要求,以下是幾個(gè)技巧與大家共同探討.
本文引用地址:http://butianyuan.cn/article/151564.htm1.內(nèi)聯(lián)匯編嵌入VC語句:
在VC中內(nèi)聯(lián)匯編非常方便,只需要按照如下格式
__asm{
//匯編語句
}
請(qǐng)看如下示例代碼
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 //隨便寫入數(shù)據(jù),此處寫入1
inc eax
mov s,eax
pushad
}
m_pr.SetValue((float)s);
__asm{
popad
loop L
}
}
}
請(qǐng)注意示例代碼中兩個(gè)__asm塊中的pushad 和 popad 語句,pushad保存了寄存器環(huán)境,popad恢復(fù)了寄存器環(huán)境,使得m_pr.SetValue((float)s);語句對(duì)寄存器的影響被抵銷,你還可以調(diào)用其他任何語句。但建議是盡量少打斷內(nèi)聯(lián)匯編塊,以減少運(yùn)行時(shí)來回倒騰寄存器環(huán)境的時(shí)間。筆者的測(cè)試是,當(dāng)刪除m_pr.SetValue((float)s);并且合并兩個(gè)__asm塊,同時(shí)刪除pushad,和popad后,速度明顯提高??梢娺@種打斷通常是得不償失。
通常要保存的寄存器環(huán)境還有Flags寄存器等,這些視具體情況而定。
2.自由使用FPU,MMX等指令
評(píng)論