读书人

ARM编译语言与C/C++的混合编程

发布时间: 2012-09-20 09:36:50 作者: rapoo

ARM汇编语言与C/C++的混合编程

ARM公司不生产芯片,而是出售核(如ARM9)给硬件厂商,硬件厂商添加一些外围器件,就成了芯片(如s3c2440)。

ARM汇编语言与C/C++的混合编程

- 在C/C++代码中嵌入汇编指令

在C/C++中使用内嵌的汇编指令语法格式:

使用关键字_ _asm来标识一段汇编指令程序

_ _asm

{

汇编语言程序

~~~~~~~~~~

汇编语言程序

}

例C1.C

#include <stdio.h>

void my_strcpy(const char *src, char *dest)

{

char ch;

_ _asm

{

loop:

ldrb ch, [src], #1

strb ch, [dest], #1

cmp ch, #0

bne loop

}

}

int main()

{

char *a = "forget it and move on!";

char b[64];

my_strcpy(a, b);

printf("original: %s", a);

printf("copyed: %s", b);

return 0;

}

二在汇编程序和C/C++的程序之间进行变量的互访

c2.c

#include <stdio.h>

/*定义全局变量gVar_1*/

int gVar_1 = 12;

extern asmDouble(void);

int main()

{

printf("original value of gVar_1 is: %d", gVar_1);

asmDouble();

printf(" modified value of gVar_1 is: %d", gVar_1);

return 0;

}

s2.S

AREA asmfile, CODE, READONLY

EXPORT asmDouble

IMPORT gVar_1 //汇编程序导入便可访问这个变量

asmDouble

ldr r0, =gVar_1

ldr r1, [r0]

mov r2, #2

mul r3, r1, r2

str r3, [r0]

mov pc, lr

END

C/C++调用汇编函数

在c中声明函数原型,并加上extern关键字

在汇编中用EXPORT导出函数名,使用mov pc , lr返回,然后在c中使用该函数。

C3.C

#include <stdio.h>

extern void asm_strcpy(const char *src, char *dest);

int main()

{

const char *s = "seasons in the sun";

char d[32];

asm_strcpy(s, d);

printf("source: %s", s);

printf("destination: %s",d);

return 0;

}

S3.S

AREA asmfile, CODE, READONLY

EXPORT asm_strcpy

asm_strcpy

loop:

ldrb r4, [r0], #1

cmp r4, #0

beq over

strb r4, [r1], #1

b loop

over:

mov pc, lr

END

四 汇编调用C

需要在汇编中用IMPORT对应的c函数名

C4.C

int cFun(int a, int b, int c)

{

return a + b + c;

}

C4.S

EXPORT asmfile

AREA asmfile, CODE, READONLY

IMPORT cFun

ENTRY

mov r0, #11

mov r1, #22

mov r2, #33

BL cFun

END

读书人网 >编程

热点推荐