新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 內(nèi)聯(lián)匯編的技巧

        內(nèi)聯(lián)匯編的技巧

        作者: 時(shí)間:2010-09-13 來(lái)源:網(wǎng)絡(luò) 收藏

          有時(shí)我們的程序需要一些很高的執(zhí)行效率或者執(zhí)行系統(tǒng)底層的功能模塊,這些關(guān)鍵的部分我們可以采用直接插入指令來(lái)達(dá)到我們的要求,以下是幾個(gè)與大家共同探討.

        本文引用地址:http://www.104case.com/article/151564.htm

          1.嵌入VC語(yǔ)句:

          在VC中匯編非常方便,只需要按照如下格式

          __asm{

          //匯編語(yǔ)句

          }

          請(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  //隨便寫(xiě)入數(shù)據(jù),此處寫(xiě)入1

          inc eax

          mov s,eax

          pushad

          }

          m_pr.SetValue((float)s);

          __asm{

          popad

          loop L

          }

          }

          }

          請(qǐng)注意示例代碼中兩個(gè)__asm塊中的pushad 和 popad 語(yǔ)句,pushad保存了寄存器環(huán)境,popad恢復(fù)了寄存器環(huán)境,使得m_pr.SetValue((float)s);語(yǔ)句對(duì)寄存器的影響被抵銷(xiāo),你還可以調(diào)用其他任何語(yǔ)句。但建議是盡量少打斷內(nèi)聯(lián)匯編塊,以減少運(yùn)行時(shí)來(lái)回倒騰寄存器環(huán)境的時(shí)間。筆者的測(cè)試是,當(dāng)刪除m_pr.SetValue((float)s);并且合并兩個(gè)__asm塊,同時(shí)刪除pushad,和popad后,速度明顯提高。可見(jiàn)這種打斷通常是得不償失。

          通常要保存的寄存器環(huán)境還有Flags寄存器等,這些視具體情況而定。

          2.自由使用FPU,MMX等指令


        上一頁(yè) 1 2 下一頁(yè)

        關(guān)鍵詞: 技巧 匯編 內(nèi)聯(lián)

        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 密云县| 阿坝| 沂南县| 杭锦旗| 农安县| 海宁市| 区。| 南宫市| 辽阳市| 扶沟县| 岫岩| 临邑县| 砀山县| 全州县| 乐至县| 桂平市| 谢通门县| 聂拉木县| 康马县| 兴山县| 岑巩县| 桑植县| 新野县| 海伦市| 万山特区| 惠东县| 苏尼特左旗| 扎鲁特旗| 清原| 安阳市| 彭阳县| 梅河口市| 固原市| 彰武县| 荣昌县| 金阳县| 靖边县| 正定县| 吉林省| 曲阜市| 德保县|