新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 混合使用C、C++和匯編語(yǔ)之: C、C++ 和 ARM 匯編語(yǔ)言之間的調(diào)用

混合使用C、C++和匯編語(yǔ)之: C、C++ 和 ARM 匯編語(yǔ)言之間的調(diào)用

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

本文引用地址:http://m.butianyuan.cn/article/257031.htm

(6)從++程序

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

下面是被++程序。

structS{//本結(jié)構(gòu)沒(méi)有基類(lèi)和虛擬函數(shù)

S(ints):i(s){}

inti;

};

externCvoidcppfunc(S*p){

//定義被調(diào)用的功能

//功能函數(shù)體

p->i+=5;

}

語(yǔ)言中,聲明要調(diào)用的功能,使用帶連接的跳轉(zhuǎn)指令調(diào)用功能。

AREAAsm,CODE

IMPORTcppfunc ;聲明被調(diào)用的C++函數(shù)名

EXPORTf

f

STMFDsp!,{lr}

MOVr0,#2

STRr0,[sp,#-4]! ;初始化結(jié)構(gòu)體

MOVr0,sp ;調(diào)用參數(shù)為指向結(jié)構(gòu)體的指針

BLcppfunc ;調(diào)用C++功能'cppfunc'

LDRr0,[sp],#4

ADDr0,r0,r0,LSL#1

LDMFDsp!,{pc}

END

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

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

下面的代碼為C++函數(shù)。

externCintcfunc(constint);

//聲明被調(diào)用的C函數(shù)

externCintcppfunc(constintr){

//定義將被C調(diào)用的C++函數(shù)

return7*r;

}

intf(){

inti=3;

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

}

下面為C函數(shù)。

externintcppfunc(constint*);

/*聲明將被調(diào)用的C++函數(shù)*/

intcfunc(constint*p){

/*定義被C++調(diào)用的C函數(shù)*/

intk=*p+4;

returncppfunc(k);

}

(8)從C或匯編語(yǔ)言調(diào)用C++

下面的例子綜合顯示了如何從C或匯編語(yǔ)言中調(diào)用非靜態(tài)、非虛的C++成員函數(shù)??梢允褂镁幾g器編譯出的匯編程序查找已延伸的函數(shù)名。

下面是被調(diào)用的C++成員函數(shù)。

structT{

T(inti):t(i){}

intt;

intf(inti);

};

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

//定義將被C調(diào)用的C++功能函數(shù)

externCintcfunc(T*);

//聲明將被C++調(diào)用的C函數(shù)

intf(){

Tt(5);//createanobjectoftypeT

returncfunc(t);

}

下面為調(diào)用C++的C語(yǔ)言函數(shù)。

structT;

externint_ZN1T1fEi(structT*,int);

/*被調(diào)用的C++函數(shù)名*/

intcfunc(structT*t){

/*定義被C++調(diào)用的C函數(shù)*/

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

}

下面為調(diào)用C++的匯編函數(shù)。

EXPORTcfunc

AREAfoo,CODE

IMPORT_ZN1T1fEi

cfunc

STMFDsp!,{lr} ;此時(shí)r0已經(jīng)包含了指向?qū)ο蟮闹羔?/p>

MOVr1,#2

BL_ZN1T1fEi

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

LDMFDsp!,{pc}

END

下面的例子顯示了如何用嵌入式匯編語(yǔ)言實(shí)現(xiàn)上面的例子。在此例中,使用__cpp關(guān)鍵字引用該函數(shù)。因此,用戶不必了解已延伸的函數(shù)名。

structT{

T(inti):t(i){}

intt;

intf(inti);

};

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

//定義被C++調(diào)用的匯編功能

__asmintasm_func(T*){

STMFDsp!,{lr}

MOVr1,#2;

BL__cpp(T::f);

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

LDMFDsp!,{pc}

}

intf(){

Tt(5);//創(chuàng)建T類(lèi)型的對(duì)象

returnasm_func(t);

}

聯(lián)系方

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



上一頁(yè) 1 2 3 下一頁(yè)

評(píng)論


相關(guān)推薦

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

關(guān)閉