混合使用C、C++和匯編語(yǔ)之: C、C++ 和 ARM 匯編語(yǔ)言之間的調(diào)用
structS{//本結(jié)構(gòu)沒(méi)有基類(lèi)和虛擬函數(shù)
S(ints):i(s){}
inti;
};
externCvoidcppfunc(S*p){
//定義被調(diào)用的C++功能
//功能函數(shù)體
p->i+=5;
}
在匯編語(yǔ)言中,聲明要調(diào)用的C++功能,使用帶連接的跳轉(zhuǎn)指令調(diào)用C++功能。
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++教程
評(píng)論