<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

本文引用地址:http://dyxdggzs.com/article/257034.htm

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

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

#1267-D:ImplicitphysicalregisterR3shouldbedefinedasavariable

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

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

#20:identifierr14isundefined

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

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

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

·含有常數操作的指令;

·LDM、STM、LDRD和STRD指令;

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

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

包含有常數操作的加法指令:

ADDr0,r0,#1023

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

ADDr0,r0,#1024

SUBr0,r0,#1

注意

擴展指令對程序狀態(tài)寄存器PSR的影響:算術(shù)指令影響相應的NZCV標準位;其他指令設置NZ標志位不影響V標志位。

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

5.內聯(lián)匯編中的常數

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

6.內聯(lián)匯編指令對標志位的影響

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

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


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




評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>