新聞中心

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

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

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

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

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

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

        __offsetof_base(D,B)

        其中,B必須是D的非虛擬基類。

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

        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)鍵字被轉(zhuǎn)換為整數(shù)或邏輯常量。只能將它們用于__asm函數(shù),而不能用于__cpp表達(dá)式。

        8.成員函數(shù)類的關(guān)鍵字

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

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

        ①__mcall_is_virtual(D,f)

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

        ②__mcall_is_in_vbase(D,f)

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

        ③__mcall_this_offset(D,f)

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

        ④__vcall_offsetof_vfunc(D,f)

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

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

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

        (1)調(diào)用非虛擬成員函數(shù)

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

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

        //所有參數(shù)準(zhǔn)備好

        //假設(shè)并不返回一個(gè)結(jié)構(gòu)類型

        if__mcall_is_in_vbase(D,f)

        ASSERT{FALSE}//cantaccessvirtualbase

        else

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

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

        endif

        BL__cpp(D::f)

        (2)調(diào)用虛擬成員函數(shù)

        例如,在虛擬或非虛擬基中,以下代碼可用于調(diào)用虛擬函數(shù):

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

        //所有參數(shù)準(zhǔn)備好

        //假如函數(shù)并不返回一個(gè)結(jié)構(gòu)類型

        if__mcall_is_in_vbase(D,f)

        ASSERT{FALSE} //不能調(diào)用虛擬基

        else

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

        LDRr12,[rp] //加載vtable表結(jié)構(gòu)指針

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

        endif

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

        LDRpc,[r12,#__vcall_offsetof_vfunc(D,f)] //調(diào)用函數(shù)rp→f()

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


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




        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 长寿区| 图们市| 武鸣县| 都江堰市| 施秉县| 佛坪县| 博客| 濮阳市| 巨鹿县| 大渡口区| 北川| 藁城市| 南召县| 和静县| 鄂伦春自治旗| 龙江县| 阜新市| 依安县| 定襄县| 乌鲁木齐市| 措美县| 遵义市| 南京市| 崇礼县| 边坝县| 盐津县| 全南县| 历史| 通山县| 包头市| 高要市| 凌海市| 舞钢市| 景泰县| 盱眙县| 莱芜市| 江永县| 涿州市| 徐州市| 武陟县| 灵川县|