目录
二、修改参考代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。 请编程实现,并仿真跟踪调试;
三、在汇编函数中调用一个 C语言写的函数,应该如何修改汇编代码?
一、C语言调用汇编函数
方法:在.c文件中用extern 函数返回类型 函数名(); 声明,然后在main函数中调用,在汇编里面用EXPORT 函数名就可以与.c文件中的函数联系起来。
在项目下新建文件main.c和Func.s

代码:
main1.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语言成功调用了汇编程序。
二、修改参考代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。 请编程实现,并仿真跟踪调试;
方法:在main函数中调用Init_1函数,给了一个参数25,函数执行完毕时,25+100的16进制数为7D,对函数执行完毕的期望值为7D,而在图中寄存器R0的值就是7D
修改main.c和Func.s文件内容
main1.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


编译调试

得到结果

符合预期,寄存器R0的值就是7D
三、在汇编函数中调用一个 C语言写的函数,应该如何修改汇编代码?
方法:在汇编中调用C语言函数XXX使用IMPORT XXX
新建Func.c和test1.s文件

代码:
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
AREA MYDATA, DATA
IMPORT sum
AREA MYCODE, CODE
ENTRY
EXPORT __main
__main
BL sum
BX LR
END


编译调试
得到结果如下:

C函数被成功调用。
四.总结
随着学的东西越高级,我就越能体会到基础的重要,不能害怕BUG,因为错,才会有经验。我应该学会和同学讨论,交流出新知,利用网上的教学视频和博客。通过本实验的学习,我对C语言调用函数参数的传递方式以及ARM寄存器使用方法有了更加深刻的理解,
本文介绍了如何在STM32项目中进行C语言与汇编的混合编程,包括C调用汇编函数、修改汇编函数实现整型加法、在汇编中调用C函数的步骤,并通过实例代码和仿真调试过程详细阐述了相关技巧,强调了基础知识的重要性。
587

被折叠的 条评论
为什么被折叠?



