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

STM32 C 语言和汇编语言混合编程

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

STM32 C 语言和汇编语言混合编程

目录

一、C语言调用汇编函数 

二、将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100

三、在汇编函数中调用一个 C语言写的函数

四、总结

五、参考链接:MDK下C与汇编语言混合编程 - the7


 

一、C语言调用汇编函数 

   1.打开keil 5新建工程

   

  

2.右击Source Group1 添加新项目

 

 

3.点击 Asm File(.s) ,输入name ,点击Add

 

 

4.输入代码:

5.重复第三步新建c File(.c) 文件,代码如下:

 

6.准备环境,实现硬件仿真

 

点击Debug 

7.调试

看图中代码7、8行初始化寄存器R1为1、R2为2,单步调试 ,看右边core中R1,R2初始化完成。

 

二、将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100

下面由于要涉及到arm寄存器的一些分析,所以我在这先简单介绍一下。

R1~R3通常用来传递函数参数
R4~R11用来保存程序运算的中间结果或函数的局部变量
R12通常用来作为函数调用过程中的临时寄存器
R13寄存器是堆栈寄存器(SP),用来保存堆栈的当前指针
R14寄存器是链接寄存器(LR),用来保存函数的返回地址
R15寄存器是程序寄存器(PC),指向程序当前的地址

修改main.c

#include 
extern int Init_1(int x);
int main()
{
	Init_1(10);
	return 0;
}

修改func.s

Init_1
    ADD R0,R0,#100	;R0记录传入的形参,并且执行R0=R0+100;
	BX LR           ;跳转的LR的地址执行,在这里,LR记录main函数调用子函数的返回地址

初始化形参 

                                               R0初始化为我设置的给定值10

 

 

                                                              R0=R0+100执行成功 

 

 

 

 当程序运行到如上图所示时,点击单步调试,注意观察到R14(LR)中的地址-1被加载到R15(PC)指针,PC指针指向该地址,即可返回主程序。

 

 

三、在汇编函数中调用一个 C语言写的函数

如在MDK下stm32程序的执行过程为

先执行.s的汇编程序,再.s文件中执行以下操作

  1. 初始化堆栈指针 SP=_initial_sp
  2. 初始化 PC 指针 =Reset_Handler
  3. 初始化中断向量表
  4. 配置系统时钟
  5. 调用 C 库函数 _main 初始化用户堆栈,从而最终调用 main 函数去到 C 的世界

然后再跳转到main函数,执行一些c语言程序。
在一些对性能要求比较高的情况下,有时也会在c语言程序在内嵌一些汇编代码。

                                             初始化R0为3,R1为4

 

 

此代码实现了在c函数中调用汇编函数,再从汇编函数中调用c函数,调用方式与之前大同小异,但是了解c程序和汇编程序相互调用,混合编程还是很有帮助的。 

四、总结

通过这次练习学到了混合编程的过程,汇编语言更能看出代码运行的过程,对代码运行更容易理解。

五、参考链接:MDK下C与汇编语言混合编程 - the7

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

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

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