在C语言中调用汇编文件中的函数,要做的主要工作有两个:
一是在C语言中声明函数原型,并加extern关键字;
二是在汇编中用EXPORT导出函数名,并用该函数名作为汇编代码段的标识,最后用mov pc, lr返回。然后,就可以在C语言中使用该函数了。
从C语言的角度,并不知道该函数的实现是用C语言还是汇编语言。更深的原因是因为C语言的函数名起到表明函数代码起始地址的位置,这个和汇编的label是一致的。
实例代码:
cpp
#include <stdio.h>
extern void asm_strcpy(const char *src, char *dest);
int main()
{
const char *s = "welcome to ETC";
char d[32];
asm_strcpy(s, d);
return 0;
}
建立strcpy.s代码,并加入工程中。
cpp
;asm function implementation
AREA asmfile, CODE, READONLY
EXPORT asm_strcpy
asm_strcpy
loop
ldrb r4, [r0], #1 ;address increment after
read
cmp r4, #0
beq over
strb r4, [r1], #1
b loop
over
mov pc, lr
END
在这里,C语言和汇编语言之间的参数传递是通过ATPCS(ARM Thumb Procedure Call Standard)的规定来进行的。简单地说,就是如果函数有不多于4个参数,对应的用R0~R3来进行传递,多于4个时借助栈,函数的返回值通过R0来返回