目录
C语言调用汇编函数一.Keil下C语言调用汇编程序
在项目下新建文件main.c和Func.s
main.c代码:
#include<stdio.h>
extern void Init_1(void);
int main(){
Init_1();
return 0;
}
Func.s代码:
AREA My_Function,CODE,READONLY
EXPORT Init_1
Init_1
MOV R1,#666
MOV R2,#888
LOOP
CMP R1,#10
BHS LOOP_END
ADD R2,#1
ADD R1,#1
B LOOP
LOOP_END
NOP
END
编译调试并运行:
可以看见c语言成功调用汇编程序。
总结:
在C语言中调用汇编函数时,需要在.c文件中用extern 函数返回类型 函数名(); 声明,然后在main函数中调用,在汇编里面用EXPORT 函数名就可以与.c文件中的函数联系起来。
将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。
C语言调用函数传递参数的方法
C语言调用函数时,在32位程序中使用栈传递,而在64位程序中,传递方式和参数个数有关,当参数个数小于等于6个时,参数会使用寄存器被传递,当参数大于6个时,6个寄存器被分配后,会利用栈来传递多余的参数,且参数的传递都是从右到左压栈或是存入寄存器。
实验过程
修改main.c文件内容
main.c
#include<stdio.h>
extern int Init_1(int x);
int main(){
Init_1(25);
return 0;
}
文件Func.s内容为
AREA My_Function,CODE,READONLY
EXPORT Init_1
ENTRY
Init_1
ADD R0,R0,#100
BX LR
END
编译调试并运行:
在该实验中,我们的Init_1函数调用时有一个参数的传递,在main函数中我们调用Init_1函数,给了一个参数25,函数执行完毕时,25+100的16进制数为7D,我们对函数执行完毕的期望值为7D,而在图中寄存器R0的值就是7D,任务完成。
在汇编函数中调用一个C语言写的函数
在汇编中调用C语言函数XXX,则加上IMPORT XXX,注意Keil工具不允许汇编语句顶格写,否则会报错。
新建Func.c文件
Func.c
#include<stdio.h>
extern int sum(int a,int b);
int sum(int a,int b){
int c;
a=100;
b=100;
c=a+b;
return c;
}
';
新建test1.s文件
test1.s
AREA MYDATA, DATA
IMPORT sum
AREA MYCODE, CODE
ENTRY
EXPORT __main
__main
BL sum
BX LR
END
编译调试结果如下:
可以看见C函数被成功调用。
总结
通过本实验的学习,对C语言调用函数参数的传递方式以及ARM寄存器使用方法有了更加深刻的理解。