目录
2.1在比较R1与10的大小处设置断点,观察每次比较时的R1和R2大小 ,初始R1和R2为0
3. 要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。
一、添加源代码与编写程序
创建新工程步骤跟上一篇博客相同,在这就不再赘述了。搭建并配置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联系起来就可以了。