混合使用C、C++和汇编语之: C、C++ 和 ARM 汇编语言之间的调用
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);
}
联系方
- RedHatLinux新手入门教程(5)(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- VXWORKS内核分析(11-11)
- 嵌入式开发工具简介(11-09)
- Linux2.4内核为我们带来了什么?(11-12)
- RedHatLinux新手入门教程(11-12)