混合使用C、C++和汇编语之: C、C++ 和 ARM 汇编语言之间的调用

时间:2013-09-30来源:网络

(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);

}

联系方

1 2 3

关键词: C C++ 汇编 调用 数据类型 ARM

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章


用户评论

请文明上网,做现代文明人
验证码:
查看电脑版