<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 混合使用C、C++和匯編語之:內(nèi)聯(lián)匯編和嵌入型匯編的使用

          混合使用C、C++和匯編語之:內(nèi)聯(lián)匯編和嵌入型匯編的使用

          作者: 時(shí)間:2013-09-30 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/257034.htm

          例子中以“>>>”的開頭的行是程序的源碼部分,緊接其后的是由編譯器編譯出的匯編代碼。從上例可以很清楚地看出,源程序中使用了r5、r6和r7,但由編譯器編譯后的代碼使用了寄存器r1、r2和r3。

          另外,需要特別指出的是在中使用寄存器必須先聲明其變量類型,如上例中的“intr5,r6,r7”。如果不在使用前進(jìn)行聲明,編譯器將給出以下錯(cuò)誤信息。

          #1267-D:ImplicitphysicalregisterR3shouldbedefinedasavariable

          編譯程序定義的虛擬寄存器有函數(shù)局部作用范圍,即在同一個(gè)函數(shù)中,涉及相同虛擬寄存器名稱的多個(gè)asm語句或聲明,訪問相同的虛擬寄存器。

          沒有為pc(r15)、lr(r14)和sp(r13)寄存器創(chuàng)建虛擬寄存器,而且不能在代碼中讀取或直接修改它們的值。如果內(nèi)聯(lián)匯編程序中出現(xiàn)了對(duì)這些寄存器的訪問,編譯器將給出以下錯(cuò)誤消息。例如,如果指定r14:

          #20:identifierr14isundefined

          內(nèi)聯(lián)匯編可以直接使用PSR和SPSR對(duì)程序狀態(tài)字進(jìn)行操作,因?yàn)閮?nèi)聯(lián)匯編中不存在虛擬處理器狀態(tài)寄存器(PSR)。任何對(duì)PSR的引用總是指向物理PSR。

          4.內(nèi)聯(lián)匯編中的指令展開

          內(nèi)聯(lián)匯編代碼中的指令可能會(huì)在編譯過程中擴(kuò)展為幾條指令。擴(kuò)展取決于指令、指令中指定的操作數(shù)個(gè)數(shù)以及每個(gè)操作數(shù)的類型和值。通常,被擴(kuò)展的指令有以下兩種情況:

          ·含有常數(shù)操作的指令;

          ·LDM、STM、LDRD和STRD指令;

          ·乘法指令MUL被擴(kuò)展為一系列的加法和移位指令。

          下面的例子說明了編譯器如何對(duì)含有常數(shù)操作的指令進(jìn)行擴(kuò)展。

          包含有常數(shù)操作的加法指令:

          ADDr0,r0,#1023

          被編譯器編譯為如下兩條指令:

          ADDr0,r0,#1024

          SUBr0,r0,#1

          注意

          擴(kuò)展指令對(duì)程序狀態(tài)寄存器PSR的影響:算術(shù)指令影響相應(yīng)的NZCV標(biāo)準(zhǔn)位;其他指令設(shè)置NZ標(biāo)志位不影響V標(biāo)志位。

          所有的LDM和STM指令被擴(kuò)展為等效的LDR和STR指令序列。然而,在優(yōu)化過程中,編譯程序可能因此將單獨(dú)的指令重組為一條LDM或STM指令。

          5.內(nèi)聯(lián)匯編中的常數(shù)

          指令中的標(biāo)志符“#”是可選的(前面的例子中,指令中常數(shù)前均加了標(biāo)志符“#”)。如果在指令中使用了“#”,則其后的表達(dá)式必為常數(shù)。

          6.內(nèi)聯(lián)匯編指令對(duì)標(biāo)志位的影響

          內(nèi)聯(lián)匯編指令可能顯式或隱式地更新處理器程序狀態(tài)寄存器的條件標(biāo)志位。在僅包含虛擬寄存器操作數(shù)或簡(jiǎn)單表達(dá)式操作數(shù)的內(nèi)聯(lián)匯編中,其執(zhí)行結(jié)果是可以預(yù)見。如果指令中指定了隱式或顯式更新條件標(biāo)志位,則條件標(biāo)志位根據(jù)指令的執(zhí)行進(jìn)行設(shè)置。如果未指定更新,則條件標(biāo)志不會(huì)更改。如果內(nèi)嵌匯編指令的操作數(shù)都不是簡(jiǎn)單操作數(shù)時(shí)或指令不顯式更新條件標(biāo)志位,則條件標(biāo)志位可能會(huì)被破壞。一般情況下,編譯程序不易診斷出對(duì)條件標(biāo)志的潛在破壞。然而,在構(gòu)造析構(gòu)臨時(shí)函數(shù)的操作數(shù)時(shí),如果指令試圖更新條件標(biāo)志,編譯程序?qū)⒔o予警告,因?yàn)槲鰳?gòu)函數(shù)可能會(huì)破壞條件標(biāo)志位。

          c語言相關(guān)文章:c語言教程


          c++相關(guān)文章:c++教程




          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();