混合使用C、C++和汇编语之: C、C++ 和 ARM 汇编语言之间的调用
BNE strcopy ;如果不是,程序跳转到strcopy继续拷贝
MOV pc,lr ;程序返回
END
按以下步骤从命令行编译该示例:
① 输入armasm -g scopy.s编译汇编语言源代码。
② 输入armcc -c -g strtest.c编译C源代码。
③ 输入armlink strtest.o scopy.o -o strtest链接目标文件。
④ 将ELF/DWARF2兼容调试器与相应调试目标配合使用,运行映像。
(2)汇编语言调用C程序
下面的例子显示了如何从汇编语言调用C程序。
下面的子程序段定义了C语言函数。
int g(int a, int b, int c, int d, int e)
{
return a + b + c + d + e;
}
下面的程序段显示了汇编语言调用。假设程序进入f时,r0中的值为i。
; int f(int i) { return g(i, 2*i, 3*i, 4*i, 5*i); }
PRESERVE8
EXPORT f
AREA f, CODE, READONLY
IMPORT g // 声明C程序g()
STR lr, [sp, #-4]! // 保存返回地址 lr
ADD r1, r0, r0 // 计算2*i(第2个参数)
ADD r2, r1, r0 // 计算3*i(第3个参数)
ADD r3, r1, r2 // 计算5*i
STR r3, [sp, #-4]! // 第五个参数通过堆栈传递
ADD r3, r1, r1 // 计算4*i(第4个参数)
BL g // 调用C程序
ADD sp, sp, #4 // 从堆栈中删除第5个参数
LDR pc, [sp], #4 // 返回
END
(3)从C++调用C
下面的例子显示了如何从C++程序中调用C函数。
下面的C++程序调用了C程序。
struct S { // 本结构没有基类和虚函数
S(int s):i(s) { }
int i;
};
extern "C" void cfunc(S *);
// 被调用的C函数使用extern"C"声明
int f(){
S s(2); // 初始化 's'
cfunc(&s); // 调用C函数 'cfunc' 将改变 's'
return si*3;
}
下面显示了被调用的C程序代码。
struct S {
int i;
};
void cfunc(struct S *p) {
/*定义被调用的C功能 */
p->i += 5;
}
(4)从C++中调用汇编
下面的例子显示了如何从C++中调用汇编程序。
下面的例子为调用汇编程序的C++代码。
struct S { // 本结果没有基类和虚拟函数
//
S(int s) : i(s) { }
int i;
};
extern "C" void asmfunc(S *); // 声明被调用的汇编函数
int f() {
S s(2); // 初始化结构体 's'
asmfunc(&s); // 调用汇编子程序 'asmfunc'
return s.i * 3;
}
下面是被调用的汇编程序。
PRESERVE8
AREA Asm, CODE
EXPORT asmfunc
asmfunc // 被调用的汇编程序定义
LDR r1, [r0]
ADD r1, r1, #5
STR r1, [r0]
MOV pc, lr
END
(5)从C中调用C++
下面的例子显示了如何从C++代码中调用C程序。
下面的代码显示了被调用C++代码。
struct S { // 本结构没有基类和虚拟函数
S(int s) : i(s) { }
int i;
};
extern "C" void cppfunc(S *p) {
// 定义被调用的C++代码
// 连接了C功能
p->i += 5; //
}
调用了C++代码的C函数。
struct S {
int i;
};
extern void cppfunc(struct S *p);
/* 声明将会被调用的C++功能 */
int f(void) {
struct S s;
s.i = 2; /* 初始化S */
cppfunc(&s);/* 调用cppfunc函数,该函数可能改变S的值 */
return s.i * 3;
}
(6)从汇编中调用C++程序
下面的代码显示了如何从汇编中调用C++程序。
下面是被调用的C++程序。
struct S { // 本结构没有基类和虚拟函数
S(int s) : i(s) { }
int i;
};
extern "C" void cppfunc(S * p) {
// 定义被调用的C++功能
// 功能函数体
p->i += 5;
}
在汇编语言中,声明要调用的C++功能,使用带连接的跳转指令调用C++功能。
AREA Asm, CODE
IMPORT cppfunc ;声明被调用的 C++ 函数名
EXPORT f
f
STMFD sp!,{lr}
MOV r0,#2
STR r0,[sp,#-4]! ;初始化结构体
MOV r0,sp ;调用参数为指向结构体的指针
BL cppfunc ;调用C++功能'cppfunc'
LDR r0, [sp], #4
ADD r0, r0, r0,LSL #1
LDMFD sp!,{pc}
END
(7)在C和C++函数间传递参数
下面的例子显示了如何在C和C++函数间传递参数。
下面的代码为C++函数。
extern "C" int cfunc(const int&);
// 声明被调用的C函数
extern "C" int cppfunc(const int& r) {
// 定义将被C调用的C++函数
return 7 * r;
}
int f() {
int i = 3;
- RedHatLinux新手入门教程(5)(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- VXWORKS内核分析(11-11)
- 嵌入式开发工具简介(11-09)
- Linux2.4内核为我们带来了什么?(11-12)
- RedHatLinux新手入门教程(11-12)