一、实验要求
在第三周STM32汇编语言编程与仿真调试的基础上,继续学习Keil下STM32的C与汇编语言混合编程。任务:
(1)参考附件资料,完成C语言调用汇编函数;
(2)修改参考代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。 请编程实现,并仿真跟踪调试;
(3)如果要求在汇编函数中调用一个C语言写的函数,应该如何修改汇编代码?
二、实验过程及结构
1、创建项目
1)打开工程
点击 Project ——> Open Project,打开之前实验“STM32汇编语言编程与仿真调试”创建的工程。
配置环境如下:
① 工程的目标环境设置为STM32F103C8;
② CMSIS下选择CORE,Device下选择Startup;
③ Output 中勾选 Create HEX File 生成 hex 文件;
④ Debug中选择“Use Simulator”,设置Dialog DLL项为“DARMSTM.DLL”,parameter项为“-pSTM32F103C8”。
2)添加文件
右击 Source Group 1 ,点击 Add New Item to Group;点击 Asm Files (.s)创建汇编文件Func.s 和C Flie(.c)创建C语言文件main.c,输入文件名。
2、C语言调用汇编函数
1)源码
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_END
NOP
END ; 必须空格后再写END,不然会被认为是段名,表示程序结束
main.c程序:
#