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

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

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

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;

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

网站地图

Top