2021年10月12日 STM32的C与汇编语言混合编程

本文介绍了在keil5环境下,如何进行STM32的C语言与汇编语言混合编程。通过建立新工程,编辑C语言和汇编代码,并进行编译调试,展示了如何在C语言中调用汇编函数,改写汇编程序以实现不同功能,以及在汇编程序中调用C语言函数的过程。最后,作者总结了实验经验,加深了对寄存器原理的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、在keil5里面利用C语言调用汇编函数

1.建立新工程

首先点击Project里面的 New uVision Project…
在这里插入图片描述
然后输入文件名main1,点击保存即可。
在这里插入图片描述
我这里选择的芯片是STM32F103VE
在这里插入图片描述
然后进行配置(如图):
在这里插入图片描述

2.编辑代码

首先在左上方工程下右击Source Group ,选择Add New Item to Group…,
在这里插入图片描述
C语言代码编辑:
先创建C文件,点击C File(.c),然后输入name,点击Add
在这里插入图片描述
然后输入C语言代码
在这里插入图片描述
C语言代码:

#include<stdio.h>
extern void Init_1(void);
int main()
{
Init_1();
return 0;
}
汇编语言编辑
还是在左上方工程下右击Source Group ,选择Add New Item to Group…,
在这里插入图片描述
然后选择 Asm File(.s),输入name,点击Add即可。
在这里插入图片描述
然后输入汇编代码:
在这里插入图片描述
代码:

AREA    My_Function,CODE,READONLY
EXPORT Init_1

Init_1
MOV R1,#0
MOV R2,#0

LOOP
CMP R1,#10
BHS LOOP_END
ADD R2,#1
ADD R1,#1
B LOOP

LOOP_END
NOP

END

此段汇编代码的解释:

AREA指令定义了一个代码段,段名为 My_Function,属性为只读;

EXPORT 将C程序中的函数Init_1连接起来;

MOV R1,#0
MOV R2,#0

这是把R1,R2寄存器初始化,取值为0;

CMP R1,#10
BHS LOOP_END

将R1的值与10相比较,若R1大于10,就跳到LOOP_END;

ADD R2,#1
ADD R1,#1

这是将寄存器R1,R2分别加1;

B LOOP 再次循环;

END 表示结束。

3.编译调试

首先点击魔法棒,
在这里插入图片描述
然后进行设置,点击Debug,勾选Use Simulator,将dialog dll下改为DARMSTM.dll ,将parameter下改为-pSTM32F103C8。用于设置支持STM32F103C8的软硬件仿真。
在这里插入图片描述
进行编译,没有错误,
在这里插入图片描述
点击图示图标进行调试,
在这里插入图片描述
进行单步调试,发现R1从1变到9,出现A时,程序结束。
在这里插入图片描述

二、改写汇编程序

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

1.C程序改写

在这里插入图片描述
代码:

#include<stdio.h>
extern int Init_1(int x);
int main()
{
Init_1(5);
return 0;
}

2.汇编程序改写

在这里插入图片描述
代码:

AREA    My_Function,CODE,READONLY
EXPORT Init_1

Init_1
ADD R0,#100

END 

解释:

要想实现X+100,在arm编程里,函数调用过程中,子函数的参数值传递按顺序存放在r0,r1,r2,r3里面,超过4个参数值传递放栈帧里(可自行查阅),这里给定参数默认放在R0里面,所以要对寄存器R0+100 。

3.编译调试

点击编译,没有错误,
在这里插入图片描述
点击图标进行调试,
在这里插入图片描述
点击F5单步调试,R0为5,
在这里插入图片描述
然后点击汇编程序,R0加了100,变成105,这里16进制下的105是69 。
在这里插入图片描述

三、在汇编程序中调用C语言中的函数

1.C语言程序改写

在这里插入图片描述
代码:

#include<stdio.h>
extern int Init_1();
int Init_1()
{
int x=5;
return x+100;
}

2.汇编程序改写

在这里插入图片描述
代码:

IMPORT Init_1
AREA MYCODE, CODE

EXPORT __main

__main
BL Init_1

END

解释:这里的IMPORT Init_1 表示汇编程序里面进口或引入C里面的函数Init_1。

3.编译调试

在这里插入图片描述
点击调试,按F5进入断点,看见R0变为69,16进制下69为105 。
在这里插入图片描述

四、总结

通过这次实验,我熟悉了keil5下汇编语言和C语言的混用,既能在C语言里面调用汇编程序,也能在汇编程序里面调用C函数,也更加清楚地了解了寄存器的原理。

五、参考文献

https://blog.youkuaiyun.com/qq1742517469/article/details/120701323

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值