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 ; B{NE}如果不等于,则跳到loop。NE:Negative 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.汇编中的label用EXPORT声明
2.C语言中用EXTERN Function调用
3.C语言使用
参数怎么调用?
ARM官网文档提到ATPCS(ARM 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 cFun(int a,int b,int c){
return a+b+c;
}
也可以直接BL Main,前提是IMPORT Main