ARM混合编程笔记

来源:互联网 发布:淘宝查看新品标签 编辑:程序博客网 时间:2024/04/30 23:45

C语言嵌入汇编

__asm [volatile] {

instruction 

Instruction

}


ADS上实践的注意事项:

混合编程最主要的是入口问题,从汇编文件的ENTRY进入,还是从C的Main进入。但ADS工具破解版的bug比较多,如下代码如果在仿真时候发现入口和预想的不对,可能是之前的修改还没被系统更新过来,这时候可以重新建立一个项目,不必再调试了,文件越改,AXD会越乱。

内联汇编实例

void  my_strcpy(char *src,char* des){

char ch;

__asm{

loop:

LDRB ch,[src],#1

STRB ch,[des]#1

CMP ch,#0

BNE loop   ; BNE}如果不等于,则跳到loopNENegative Equal

}

}

int Main(){

char * a = “Hello world”;

char b[64];

my_strcpy(a,b);

}

//注意:Main要大小开头,我用的AXD1.2版本不识别main,会报错

Warning : L6301W: Could not find file C:\Program Files .

Project: ARMC.mcp, Target: DebugRel

 

Warning : L6301W: Could not find file C:\Program Files .

Project: ARMC.mcp, Target: DebugRel

Warning : L6301W: Could not find file C:\Program Files .

Project: ARMC.mcp, Target: DebugRel

Error   : L6218E: Undefined symbol __main (referred from hello.o).

Project: ARMC.mcp, Target: DebugRel

Error   : L6218E: Undefined symbol _main (referred from hello.o).

Project: ARMC.mcp, Target: DebugRel

Finished: 0 information, 3 warning and 2 error messages.

C语言调用汇编

步骤如下:

1.汇编中的labelEXPORT声明

2.C语言中用EXTERN Function调用

3.C语言使用

参数怎么调用?

ARM官网文档提到ATPCSARM Thumb Procedure Call Standard)规范。通过R0-R3传递,R0传递第一个参数,R1传第二个,多于4个时用堆栈完成,函数返回值用R0传递。

myCopy.s

AREA myCopy,CODE,READONLY

EXPORT my_strcpy

;因为不是入口,所以不用加ENTRY

my_strcpy

LOOP

LDRB R4,[R0],#1

CMP R4,#0

BEQ OVER

STRB R4,[R1],#1

B LOOP

OVER

END

Main.c

extern void my_strcpy(char *src,char*des);

int Main(){

char *a = “hello norton”;

Char b[64];

my_strcpy(a,b);

}

汇编调用C语言

同样,R0-R4对应参数,跳转前,先给寄存器赋值。返回值是R0.

ARMCallC.s

AREA myCopy,CODE,READONLY

IMPORT cFun

ENTRY

START

MOV R0,#0x01

MOV R1,#0x02

MOV R2,#0x03

BL cFun   ;长跳转

MOV R4,R0  ;保存结果到R4

END

func.c

int cFunint a,int b,int c){

return a+b+c; 

也可以直接BL Main,前提是IMPORT Main

原创粉丝点击