新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 混合使用C、C++和匯編語之: C、C++ 和 ARM 匯編語言之間的調用

        混合使用C、C++和匯編語之: C、C++ 和 ARM 匯編語言之間的調用

        作者: 時間:2013-09-30 來源:網絡 收藏

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

        (6)從++程序

        下面的代碼顯示了如何從++程序。

        下面是被++程序。

        structS{//本結構沒有基類和虛擬函數

        S(ints):i(s){}

        inti;

        };

        externCvoidcppfunc(S*p){

        //定義被調用的功能

        //功能函數體

        p->i+=5;

        }

        語言中,聲明要調用的功能,使用帶連接的跳轉指令調用功能。

        AREAAsm,CODE

        IMPORTcppfunc ;聲明被調用的C++函數名

        EXPORTf

        f

        STMFDsp!,{lr}

        MOVr0,#2

        STRr0,[sp,#-4]! ;初始化結構體

        MOVr0,sp ;調用參數為指向結構體的指針

        BLcppfunc ;調用C++功能'cppfunc'

        LDRr0,[sp],#4

        ADDr0,r0,r0,LSL#1

        LDMFDsp!,{pc}

        END

        (7)在C和C++函數間傳遞參數

        下面的例子顯示了如何在C和C++函數間傳遞參數。

        下面的代碼為C++函數。

        externCintcfunc(constint);

        //聲明被調用的C函數

        externCintcppfunc(constintr){

        //定義將被C調用的C++函數

        return7*r;

        }

        intf(){

        inti=3;

        returncfunc(i); //相C函數傳參

        }

        下面為C函數。

        externintcppfunc(constint*);

        /*聲明將被調用的C++函數*/

        intcfunc(constint*p){

        /*定義被C++調用的C函數*/

        intk=*p+4;

        returncppfunc(k);

        }

        (8)從C或匯編語言調用C++

        下面的例子綜合顯示了如何從C或匯編語言中調用非靜態、非虛的C++成員函數。可以使用編譯器編譯出的匯編程序查找已延伸的函數名。

        下面是被調用的C++成員函數。

        structT{

        T(inti):t(i){}

        intt;

        intf(inti);

        };

        intT::f(inti){returni+t;}

        //定義將被C調用的C++功能函數

        externCintcfunc(T*);

        //聲明將被C++調用的C函數

        intf(){

        Tt(5);//createanobjectoftypeT

        returncfunc(t);

        }

        下面為調用C++的C語言函數。

        structT;

        externint_ZN1T1fEi(structT*,int);

        /*被調用的C++函數名*/

        intcfunc(structT*t){

        /*定義被C++調用的C函數*/

        return3*_ZN1T1fEi(t,2);/*實現3乘以t->f(2)功能*/

        }

        下面為調用C++的匯編函數。

        EXPORTcfunc

        AREAfoo,CODE

        IMPORT_ZN1T1fEi

        cfunc

        STMFDsp!,{lr} ;此時r0已經包含了指向對象的指針

        MOVr1,#2

        BL_ZN1T1fEi

        ADDr0,r0,r0,LSL#1 ;r0乘以3

        LDMFDsp!,{pc}

        END

        下面的例子顯示了如何用嵌入式匯編語言實現上面的例子。在此例中,使用__cpp關鍵字引用該函數。因此,用戶不必了解已延伸的函數名。

        structT{

        T(inti):t(i){}

        intt;

        intf(inti);

        };

        intT::f(inti){returni+t;}

        //定義被C++調用的匯編功能

        __asmintasm_func(T*){

        STMFDsp!,{lr}

        MOVr1,#2;

        BL__cpp(T::f);

        ADDr0,r0,r0,LSL#1;r0乘以3

        LDMFDsp!,{pc}

        }

        intf(){

        Tt(5);//創建T類型的對象

        returnasm_func(t);

        }

        聯系方

        c++相關文章:c++教程



        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 漳州市| 安多县| 西丰县| 勃利县| 尚志市| 兴业县| 苍南县| 嘉义市| 福鼎市| 潼南县| 湟源县| 鄂尔多斯市| 黄浦区| 将乐县| 泰安市| 蕉岭县| 连州市| 醴陵市| 安化县| 确山县| 普兰店市| 高安市| 微山县| 双辽市| 阳城县| 尼木县| 枝江市| 外汇| 札达县| 会泽县| 朝阳县| 沅陵县| 天津市| 澄城县| 昌邑市| 黄陵县| 张家川| 南宫市| 阿荣旗| 闻喜县| 章丘市|