STM32的C与汇编语言混合编程
嵌入式作业5
要求:修改参考代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。请编程实现,并仿真跟踪调试。
一、创建并调试项目
-
open project -
基础设置 -
新建main.c和test1.s main.c #include<stdio.h>
extern void Init_1(void);
int main(){
Init_1();
return 0;
}
test1.s AREA MY_FUNCTION,CODE,READONLY
EXPORT Init_1
Init_1
MOV R1,#0
MOV R2,#0
LOOP
CMP R1,#10
BHS LOOP_END
ADD R2,#1
ADD R1,#1
B LOOP
LOOP_END
NOP
END
-
编译 这里又遇到了 Target not creat. 的问题,可以参考我的上一篇博客解决。 -
完成!
二、C语言调用汇编函数
- 设置断点
test1.s
#include<stdio.h>
extern int Init_1(int x);
int main(){
int a = Init_1(5);
printf("%d", a);
return 0;
}
main.c
AREA MY_FUNCTION,CODE,READONLY
EXPORT Init_1
Init_1
ADD R0,#100
MOV PC,LR
LOOP
CMP R1,#10
BHS LOOP_END
ADD R2,#1
ADD R1,#1
B LOOP
LOOP_END
NOP
END
- 调试
得到
十六进制105=69
三、汇编函数调用C语言
-
设置断点 test1.s
AREA My_Function,CODE,READONLY
EXPORT Init_1
IMPORT get5
Init_1
MOV R1,#0
MOV R2,#0
LOOP
CMP R1,#10
BHS LOOP_END
ADD R2,#1
ADD R1,#1
BL get5
B LOOP
LOOP_END
NOP
END
main.c
#include<stdio.h>
extern void Init_1(void);
int get5(void);
int main(){
Init_1();
return 0;
}
int get5(){
return 5;
}
- 调试
得到
四、总结
这次作业我遇到了很多问题,在自己查阅资料以及请教同学的情况下完成了这次作业,同时加深了对寄存器的了解,知道了调用函数的时候寄存器的使用情况和相关参数的变化,为进一步的深入了解奠定了基础。
五、参考资料
https://blog.csdn.net/qq_48641886/article/details/120710452?spm=1001.2014.3001.5502
|