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

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

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

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

目录
  • 一、在C语言中调用汇编函数
    • 1、工程环境
    • 2、代码编写
    • 3、代码调试
    • 4、运行结果
  • 二、在汇编语言中调用C函数
    • 1、工程环境
    • 2、代码编写
    • 3、代码调试
    • 4、运行结果
  • 三、总结
  • 四、参考

一、在C语言中调用汇编函数 1、工程环境

(1)在keil下新建一个工程,选用STM32F103C8

(2)ARM的CMSIS已经把开发所需要的软件组件都封装好了,因此直接选择即可;
CMSIS下选择CORE
DeviceStartup,其中包含了启动文件;
具体如下图所示;

2、代码编写

要求:用汇编语言编写函数 ,功能为 传入一个整型数x,函数运行后返回整型数 x+100。并用C语言调用此函数。

(1)在工程中加入main.cfunc.s文件



(2)main.c代码如下:

#include
extern int Init_1(int x);		//引用外部函数
int main()
{
int x=20;		//定义的变量x,可以直接在这里改变x的值
Init_1(x);
	return 0;
}

(3)func.s代码如下:

    AREA My_Function,CODE,READONLY;这一行除了My_Function可以自己取名字以外,其他的都是模板,不能改动
	EXPORT Init_1;Init_1是我们在main中用到的函数,这里是做一个函数声明
Init_1
	ADD r0,#100;寄存器R0的值加上100再保存到R0中
	BX lr;将寄存器R0的值返回到主函数
	END;
3、代码调试

(1)点击魔法棒
(2)Debug里勾选Use Simulator进行软件仿真

(3)Dialog DLL改为DARMSTM.dllParameter改为-pSTM32F103C8

4、运行结果

F11 单步调式到 x=20,查看变量x的值,x=20,换成十六进制为 14,正确。

继续单步调试进入外部函数,查看寄存器r0的值,20+100=120,换成十六进制为 78,正确。

二、在汇编语言中调用C函数 1、工程环境

与前面相同,此处直接跳过

2、代码编写

(1)main.c

#include 
extern int asm_main(void);  //声明汇编函数
int init_1(int x)
{
	return x+100;
}
int main()
{
	asm_main();  //调用汇编函数
	return 0;
}

(2)func.s

	AREA	My_Fuction,CODE,READONLY;这一行除了My_Function可以自己取名字以外,其他的都是模板,不能改动
	import	init_1;引入外部函数,即C语言函数init_1
	EXPORT  asm_main;asm_main是我们在main中用到的函数,这里是做一个函数声明
	
asm_main
	MOV r0, #20;寄存器R0的值加上20再存入R0中
	BL init_1;调用main中的init_1函数
	BX lr;返回主函数
	END;
3、代码调试

也与前面相同,直接跳过

4、运行结果

使用R0进行传参,查看R0的值。20换成十六进制为14,正确。

继续单步调试,查看调用外部函数init后,R0接受的返回值。120的十六进制为78,正确。

三、总结

学习到了C语言与汇编语言之间进行相互调用的规则,以及简单的汇编语言代码的书写规则。

四、参考

1、C语言在ARM中函数调用时,栈是如何变化的?
2、在汇编代码中调用C函数
3、C函数与汇编函数之间参数及返回值传递方法

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

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

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