<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

3.嵌入式匯編程序表達式和++表達式之間的差異

嵌入式匯編表達式和表達式之間存在以下差異。

①匯編程序表達式總是無(wú)符號的。相同的表達式在匯編程序和C或中有不同值。例如:

MOVr0,#(-33554432/2)//結果為0x7f000000

MOVr0,#__cpp(-33554432/2)//結果為0xff000000

②以0開(kāi)頭的匯編程序編碼仍是十進(jìn)制的。例如:

MOVr0,#0700//十進(jìn)制700

MOVr0,#__cpp(0700)//八進(jìn)制0700等于十進(jìn)制448

③匯編程序運算符優(yōu)先順序與C和不同。例如:

MOVr0,#(0x23:AND:0xf+1)//((0x230xf)+1)=>4

MOVr0,#__cpp(0x230xf+1)//(0x23(0xf+1))=>0

④匯編程序字符串不是以空字符為終止標志的:

DCBnotrailingnull//16bytes

DCB__cpp(Ihaveatrailingnull!!)//25bytes

注意

在_cpp標識符作用范圍之內使用C或C++語(yǔ)法規則。

4.嵌入式匯編函數的生成

由關(guān)鍵字__asm聲明的嵌入式匯編程序,在編譯時(shí)將作為整個(gè)文件體傳遞給匯編器。傳遞過(guò)程中,__asm函數的順序保持不變(用模板實(shí)例生成的函數除外)。正是由于嵌入式匯編的這個(gè)特性,使得由一個(gè)__asm標識的嵌入式匯編程序調用在同一文件中的另一個(gè)嵌入式匯編程序是可以實(shí)現的。

當使用編譯器armcc時(shí),局部鏈接器(PartialLink)將匯編程序產(chǎn)生的目標文件與編譯C程序的目標文件相結合,產(chǎn)生單個(gè)目標文件。

編譯程序為每個(gè)__asm函數生成AREA命令。例如,以下__asm函數:

#includecstddef>

structX{intx,y;voidaddto_y(int);};

__asmvoidX::addto_y(int){

LDRr2,[r0,#__cpp(offsetof(X,y))]

ADDr1,r2,r1

STRr1,[r0,#__cpp(offsetof(X,y))]

BXlr

}

對于此函數,編譯程序生成:

AREA||.emb_text||,CODE,READONLY

EXPORT|_ZN1X7addto_yEi|

#linenumfile

|_ZN1X7addto_yEi|PROC

LDRr2,[r0,#4]

ADDr1,r2,r1

STRr1,[r0,#4]

BXlr

ENDP

END

由上面的例子可以看出,對于變量offsetof的使用必須加__cpp()標識符才能引用,因為該變量是在cstddef頭文件中定義的。

由__asm聲明的常規函數被放在名為.emb_text的段(Section)中。這一點(diǎn)也是嵌入式匯編和最大的不同。相反,隱式實(shí)例模板函數(ImplicitlyInstantiatedTemplateFunction)和函數放在與函數名同名的區域(Area)內,并為該區域增加公共屬性。這就確保了這類(lèi)函數的特殊語(yǔ)義得以保持。

由于內聯(lián)和模板函數的區域的特殊命名,所以這些函數不按照文件中定義的順序排列,而是任意排序。因此,不能以__asm函數在原文件中的排列順序,來(lái)判斷它們的執行順序,也就是說(shuō),即使兩個(gè)連續排列的__asm函數,也不一定能順序執行。

5.關(guān)鍵字__cpp

可用__cpp關(guān)鍵字從匯編代碼中訪(fǎng)問(wèn)C或C++的編譯時(shí)常量表達式,其中包括含有外部鏈接的數據或函數地址。標識符__cpp內的表達式必須是適合用作C++靜態(tài)初始化的常量表達式(請參閱ISO/IEC14882:1998中的3.6.2非本地對象初始化一節和本書(shū)的常量表達式一節)。

編譯時(shí),編譯器將使用__cpp(expr)的地方用匯編程序可以使用的常量所取代。例如:

LDRr0,=__cpp(some_variable)

LDRr1,=__cpp(some_function)

BL__cpp(some_function)

MOVr0,#__cpp(some_constant_expr)

__cpp表達式中的名稱(chēng)可在__asm函數的C++上下文中查閱。__cpp表達式結果中的任何名稱(chēng)按照要求被損毀并自動(dòng)為其生成IMPORT語(yǔ)句。

6.手動(dòng)重復解決方案

可以在嵌入式匯編中使用C++轉換為非虛擬函數調用解決重復。例如:

voidg(int);

voidg(long);

structT{

intmf(int);

intmf(int,int);

};

__asmvoidf(T*,int,int){

BL__cpp(static_castint(T::*)(int,int)>(T::mf))//callsT::mf(int,int)

BL__cpp(static_castvoid(*)(int)>(g))//callsg(int)

MOVpc,lr

}

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>