<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

7.相關(guān)基類(lèi)的關(guān)鍵字

利用以下關(guān)鍵字可以確定從對象起始處到其相關(guān)基類(lèi)的偏移量:

__offsetof_base(D,B)

其中,B必須是D的非虛擬基類(lèi)。

該函數返回從D對象的起始處到其中B基子對象的起始處的偏移量。結果可能是零。必須將偏移量(以字節為單位)添加到D*p來(lái)執行。

static_castB*>(p)的等效功能,如下程序段所示:

__asmB*my_static_base_cast(D*/*p*/){

if__offsetof_base(D,B)>0 //排除偏移量為0的情況

ADDr0,r0,#__offsetof_base(D,B)

endif

MOVpc,lr

}

在匯編程序源代碼中,這些關(guān)鍵字被轉換為整數或邏輯常量。只能將它們用于__asm函數,而不能用于__cpp表達式。

8.成員函數類(lèi)的關(guān)鍵字

以下關(guān)鍵字方便了從__asm函數中調用虛擬或非虛擬成員函數。以__mcall開(kāi)頭的關(guān)鍵字可用于虛擬和非虛擬函數。以__vcall開(kāi)頭的關(guān)鍵字僅能用于虛擬函數。在調用靜態(tài)成員函數的過(guò)程中,這些關(guān)鍵字沒(méi)有特別的作用。

下面詳細介紹這些關(guān)鍵字的使用。

①__mcall_is_virtual(D,f)

如果f是D中的虛擬成員函數或是D的基類(lèi),結果是{TRUE},否則結果是{FALSE}。如果返回{TRUE},可用虛擬調度進(jìn)行調用,否則必須直接進(jìn)行調用。

②__mcall_is_in_vbase(D,f)

如果f是D虛擬基類(lèi)中的非靜態(tài)成員函數,結果是{TRUE},否則結果是{FALSE}。如果返回{TRUE},必須用__mcall_offsetof_vbaseptr(D,f)進(jìn)行this調整,否則必須用__mcall_this_
offset(D,f)進(jìn)行調整。

③__mcall_this_offset(D,f)

其中D是類(lèi),f是D中定義的非靜態(tài)成員函數或是D的非虛擬基類(lèi)。該函數返回從D對象的起始處到定義f的基的起始處的偏移量。在用指向D的指針調用f的過(guò)程中,這是必要的this調整。返回值在D中可找到f時(shí)為零,或者與__offsetof_base(D,B)相同,其中B為包含f的D非虛擬基類(lèi)。在D的虛擬基類(lèi)中找到f時(shí),如果使用__mcall_this_offset(D,f),則返回任意值,在程序中使用該返回值,匯編器將報告__mcall_this_offset無(wú)效使用的錯誤。

④__vcall_offsetof_vfunc(D,f)

其中D是類(lèi),f是D中定義的虛擬函數或是D的基類(lèi)。將偏移量返回到虛擬函數表,在該表中可以找到從虛擬函數表到虛擬函數的偏移量。在f不是虛擬成員函數時(shí),如果使用__vcall_offsetof_vfunc(D,f),則返回任意值,而在設計上使用該值時(shí)會(huì )導致匯編錯誤。

9.調用非靜態(tài)成員函數

本小節列出了可以從__asm函數中調用虛擬或非虛擬函數的關(guān)鍵字。靜態(tài)成員函數的參數不相同(沒(méi)有this),使得檢測靜態(tài)成員函數的關(guān)鍵字__mcall_is_static不可用,因此調用位置很可能已經(jīng)專(zhuān)用于調用靜態(tài)成員函數。

(1)調用非虛擬成員函數

例如,在虛擬基(virtualbase)或非虛擬基(non-virtualbase)中,以下代碼可用于調用虛擬函數:

//rp包含指向D的指針,該程序的功能是實(shí)現在使用rp時(shí)調用D的非虛成員函數f

//所有參數準備好

//假設并不返回一個(gè)結構類(lèi)型

if__mcall_is_in_vbase(D,f)

ASSERT{FALSE}//cantaccessvirtualbase

else

MOVr0,rp //使用指向D的指針rp*

ADDr0,r0,#__mcall_this_offset(D,f) //地址調整

endif

BL__cpp(D::f)

(2)調用虛擬成員函數

例如,在虛擬或非虛擬基中,以下代碼可用于調用虛擬函數:

//rp包含指向D的指針,該程序的功能是在使用rp時(shí)調用D的虛擬函數f

//所有參數準備好

//假如函數并不返回一個(gè)結構類(lèi)型

if__mcall_is_in_vbase(D,f)

ASSERT{FALSE} //不能調用虛擬基

else

MOVr0,rp //使用指向D的指針rp

LDRr12,[rp] //加載vtable表結構指針

ADDr0,r0,#__mcall_this_offset(D,f) //地址調整

endif

MOVlr,pc //保存返回地址到lr

LDRpc,[r12,#__vcall_offsetof_vfunc(D,f)] //調用函數rp→f()

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>