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

目录

一、添加源代码与编写程序

1.main.c代码

2.func.s代码

 二.编译并调试

1.编译并调试:

2.调试结果:

2.1在比较R1与10的大小处设置断点,观察每次比较时的R1和R2大小 ,初始R1和R2为0

 2.2由于目前R1是小于10的会不断进入i++和j++循环

2.3 当R1>10时,跳出循环到LOOP_END 

 三.修改参考代码

1. 函数的参数传递机制

2.寄存器与堆栈使用规则

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

3.1main.c

3.2Func.s

3.3添加文件并开始编译

 3.4调试结果

四.总结

参考文献:



一、添加源代码与编写程序

创建新工程步骤跟上一篇博客相同,在这就不再赘述了。搭建并配置Keil嵌入式开发环境,完成一个基于STM32汇编程序的编写_SS_SS_SSS_SSS的博客-CSDN博客 

1.main.c代码

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

2.func.s代码

	AREA	My_Function,CODE,READONLY	;这一行必有的除了My_ Function可以自己取名意以外,其它的都是模版啦
	EXPORT Init_1	;与在c文件中定义的Init_ 1函数关联起来
	;高级语言中的声明和使用变量其实是对板子寄存器的使用,所以我们只需要直接使用寄存器即可
Init_1
	MOV R1,#0	;设R1寄存器是i
	MOV R2,#0	;设R2寄存器是j
LOOP	;写在最左边的是程序段的段名,执行跳转程序时用到。循环开始的段
	CMP R1,#10 ;比较R1和10的大小
	BHS LOOP_END	;如果R1大于或等于10,则跳转到LoOP_ END程序段,反之忽略该语句,直接执行下面的语句
	ADD R2,#1	;j++
	ADD R1,#1	;i++
	B LOOP	;执行一次循环后,无条件再次进入循环判断,既是跳转到Loop段
LOOP_END	;写在最左边的是程序段的段名,执行跳转程序时要用到
	NOP
	END	;必须空格后再写END,不然会被认为是段名,表示程序结束

 提示:要空格后再写END,不然会被认为是段名,表示程序结束。

第一排代码AREA***要空格,不能顶格。

LOOP_END 注意不要“LOOP”和“_”和“END”之间不能有空格 比如“LOOP_ END”不然就会报错:

这个错误找了很久,最后才发现是因为“LOOP”和“_”和“END”之间的空格。

原理:首先在C里面用 extern 声明 Init_1这个函数,再在main里面调用好了。 然后在汇编里面用EXPORT Init_1与C联系起来就可以了。

 二.编译并调试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值