栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录

一、在C语言中调用汇编语言函数

1、首先创建一个工程test2。

2、在test2中添加C语言。

 3、在test2中添加汇编语言。

4、编译运行程序 

二、在汇编语言中调用C语言函数

1、编写C语言代码

2、编写汇编语言函数 

3、编译程序 

 4、调试运行程序

三、总结 


一、在C语言中调用汇编语言函数

1、首先创建一个工程test2。

新建工程和在工程中添加代码详情可以参考我之前的一个博客:

Keil环境下创建STM32汇编语言工程分析HEX文件内容并观察ARM寄存器变化情况_shutupbb的博客-CSDN博客

2、在test2中添加C语言。

此次程序的功能为传入一个整型数x,函数运行后返回整型数 x+100。首先编写一个C语言程序,但在里面声明一下汇编语言的函数。

#include
 extern int Init_1(int x);     //声明汇编语言的函数
 int main(void)
 {
	 int x=10;
	 Init_1(x);               //调用汇编语言函数
	 return 0;
 }

   

 3、在test2中添加汇编语言。

编写一个汇编语言程序,实现函数功能。

 AREA	My_Function,CODE,READonLY
	 EXPORT Init_1
Init_1
    ADD R0,R0,#100
	bx lr
	END

此处要注意汇编语言的格式,第一行要空格,第二行也要按tab键空格,否则会报错。 

4、编译运行程序 

点击右上角的Bulid键,进行软件的编译。

 

运行成功,没有报错。

 点击调试按钮进行程序的调试运行。

                                                            

 可以看到变量值x为A,换成十进制即为10,与我们所设定的相符。

 单步调试至函数运行完成,我们可以观察到寄存器R0的值发生变化,变为6E,转换为十进制即为110,即10+100,证明函数调用成功了。

二、在汇编语言中调用C语言函数

1、编写C语言代码
#include
extern void ASM();      //声明汇编语言函数
int Init_1(int x)
{
  return x+100;
}
int main()
{
  ASM();              //再次调用汇编函数
  return 0;
}

 

2、编写汇编语言函数 
AREA	My_Function,CODE,READonLY
	 import Init_1   //引入C语言函数Init_1
	 EXPORT ASM     //声明函数ASM
ASM
    MOV R0,#10       //R0赋值为10
	BL Init_1
	bx lr
	END

 

3、编译程序 

与之前步骤相同,没有出现错误

 4、调试运行程序

与之前步骤相同,经过单步调试之后我们可以观察到寄存器R0的值为A,换算成十六进制为10,即初始值设定成功了。

继续调试,最后运行完成可以看到此时R0为6E,换算成十六进制为110,运行成功。

三、总结 

  无论是在C语言中调用汇编语言函数还是在汇编语言中调用C语言函数,必须完成的一步就是声明需要调用的全局函数,这样才能在另外的程序中找到并且调用它。同时,在编写汇编语言时,需要注意格式问题,具体要求上文已告诉。 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/317079.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号