混合使用C、C++和汇编语之: C、C++ 和 ARM 汇编语言之间的调用
(6)从汇编中调用C++程序
下面的代码显示了如何从汇编中调用C++程序。
下面是被调用的C++程序。
structS{//本结构没有基类和虚拟函数
S(ints):i(s){}
inti;
};
externCvoidcppfunc(S*p){
//定义被调用的C++功能
//功能函数体
p->i+=5;
}
在汇编语言中,声明要调用的C++功能,使用带连接的跳转指令调用C++功能。
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);
}
联系方
![](https://webstorage.eepw.com.cn/images/2014/m/wx.png)
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码