STM32的C与汇编语言混合编程

本文介绍了如何在STM32项目中进行C语言与汇编的混合编程,包括C调用汇编函数、修改汇编函数实现整型加法、在汇编中调用C函数的步骤,并通过实例代码和仿真调试过程详细阐述了相关技巧,强调了基础知识的重要性。

目录

一、C语言调用汇编函数

二、修改参考代码,要求将原汇编语言 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寄存器使用方法有了更加深刻的理解,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值