微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 混合使用C、C++和汇编语之: C、C++ 和 ARM 汇编语言之间的调用

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

时间:08-30 来源:3721RD 点击:

return cfunc(i); // 相C函数传参

}

下面为C函数。

extern int cppfunc(const int*);

/* 声明将被调用的C++函数 */

int cfunc(const int *p) {

/*定义被C++调用的C函数*/

int k = *p + 4;

return cppfunc(&k);

}

(8)从C或汇编语言调用C++

下面的例子综合显示了如何从C或汇编语言中调用非静态、非虚的C++成员函数。可以使用编译器编译出的汇编程序查找已延伸的函数名。

下面是被调用的C++成员函数。

struct T {

T(int i) : t(i) { }

int t;

int f(int i);

};

int T::f(int i) { return i + t; }

// 定义将被C调用的C++功能函数

extern "C" int cfunc(T*);

// 声明将被C++调用的C函数

int f() {

T t(5); // create an object of type T

return cfunc(&t);

}

下面为调用C++的C语言函数。

struct T;

extern int _ZN1T1fEi(struct T*, int);

/* 被调用的C++函数名 */

int cfunc(struct T* t) {

/* 定义被C++调用的C函数 */

return 3 * _ZN1T1fEi(t, 2); /* 实现3乘以t->f(2)功能 */

}

下面为调用C++的汇编函数。

EXPORT cfunc

AREA foo, CODE

IMPORT _ZN1T1fEi

cfunc

STMFD sp!,{lr} ;此时r0已经包含了指向对象的指针

MOV r1, #2

BL _ZN1T1fEi

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

LDMFD sp!,{pc}

END

下面的例子显示了如何用嵌入式汇编语言实现上面的例子。在此例中,使用 __cpp 关键字引用该函数。因此,用户不必了解已延伸的函数名。

struct T {

T(int i) : t(i) { }

int t;

int f(int i);

};

int T::f(int i) { return i + t; }

// 定义被C++调用的汇编功能

__asm int asm_func(T*) {

STMFD sp!, {lr}

MOV r1, #2;

BL __cpp(T::f);

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

LDMFD sp!, {pc}

}

int f() {

T t(5); // 创建T类型的对象

return asm_func(&t);

}

联系方

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top