目录
1,无参函数调用
1,创建项目
2,代码
3,编译和调试
2,有参函数调用
1,代码修改
2,运行
3、汇编语言调用C语言
1,代码修改
2,运行结果
4,实验总结
5,参考
1,无参函数调用
1,创建项目
在我上一次博客中有介绍如何创建一个新的项目,这里就不写如何创建了,直接上代码和图片
MDK基于STM32汇编程序并编写软件程序_可小阿木的博客-CSDN博客
这里是创建.c文件
创建.s文件
2,代码
然后是ccc.c中代码
# includeextern void Init_1(void); int main(){ Init_1(); return 0; }
Fun.c中代码
AREA MY_FUNCTION,CODE,READonLY EXPORT Init_1 ; 与在c文件中定义的Init_1函数关联起来 ; 高级语言中的声明和使用变量其实是对板子寄存器的使用,所以我们只需要直接使用寄存器即可 Init_1 MOV R1,#0 ; 设R1寄存器为i MOV R2,#0 ; 设R2寄存器为j LOOP ; 写在最左边的是程序段的段名,执行跳转程序时用到 CMP R1,#10 ; 比较R1和10的大小 BHS LOOP_END ; 如果R1大于等于10,则跳转到LOOP_END程序段,反之忽略该语句,直接执行下面的语句 ADD R2,#1 ; j++ ADD R1,#1 ; i++ B LOOP ; 循环 LOOP_END NOP END ; 必须空格后再写END,不然会被认为是段名,表示程序结束
3,编译和调试
这个我的上个博客有,这里就不多加赘述了
MDK基于STM32汇编程序并编写软件程序_可小阿木的博客-CSDN博客
然后就开始运行
初始为0,
然后一直f11调试,可以看到能从1增加到10
2,有参函数调用
1,代码修改
ccc.c
# includeextern int Init_1(int x); int main(){ int y = Init_1(10); printf("%d", y); return 0; }
Fun.s
AREA MY_Function,CODE,READonLY EXPORT Init_1 ; 与在c文件中定义的Init_1函数关联起来 ; 高级语言中的声明和使用变量其实是对板子寄存器的使用,所以我们只需要直接使用寄存器即可 Init_1 ADD R0,#100 ; 将传入的值+100 MOV PC,LR ; 返回R0 LOOP ; 写在最左边的是程序段的段名,执行跳转程序时用到 CMP R1,#10 ; 比较R1和10的大小 BHS LOOP_END ; 如果R1大于等于10,则跳转到LOOP_END程序段,反之忽略该语句,直接执行下面的语句 ADD R2,#1 ; j++ ADD R1,#1 ; i++ B LOOP ; 循环 LOOP_END NOP END ; 必须空格后再写END,不然会被认为是段名,表示程序结束
2,运行
1,开始运行
运行结果
分析:MOV PC,LR:PC端返回R0的值6E。R1返回6E是因为在.c文件的主函数中,我又重新定义了一个变量y,变量y需要存储值就用了寄存器R1,y为汇编的返回值6E。
3、汇编语言调用C语言 1,代码修改
ccc.c
int cFunAdd(int a,int b,int c)
{
a=1;
b=10;
c=2;
return a*b+c;
}
Fun.s
AREA text,CODE,READonLY
import cFunAdd
ENTRY
EXPORT __main
__main
MOV R0,#1
MOV R1,#2
MOV R2,#3
LDR R5,=cFunAdd
BLX R5 ;3.汇编中调用C函数
MOV R4,R0
MOV PC,LR
NOP
END
2,运行结果
1,开始运行时
2,结果
4,实验总结
汇编语言在Arm系统中是常用的语言,C语言又为计算机的基础语言,学会二者之间的调用很重要。本次实验是第一次自己修改汇编语言,在实验过程中,我参考了很多的资料,查了很多汇编语言的命令含义。感觉终于明白了一点点,汇编语言的格式要求非常严格。在运行之前要先弄明白函数之间是如何调用的和寄存器R1~R15的功能,虽然在学单片机的时候学过,但是我忘记了。所以在实验过程中对于寄存器的理解过程我也花了很长时间
5,参考
STM32的C与汇编语言的混合编程_junseven164的博客-CSDN博客



