久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

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

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

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

本文引用地址:http://cqxgywz.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 下一頁

評論


相關推薦

技術專區

關閉