1 创建工程
创建过程与之前文章中的一样,本文不做详细介绍,详情参考: 基于Keil MDK 完成对纯汇编语言的STM32工程的建立
1.1 添加源文件
分别添加一个汇编语言文件与C语言文件
1.2 编写程序
#include<stdio.h>
extern void Init_1(void);
int main()
{
Init_1();
return 0;
}
AREA MY_FUNCTION,CODE,READONLY
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,不然会被认为是段名,表示程序结束
1.3 配置目标
在“Debug”选项卡中选择“Use Simulator”,表示使用软件仿真。设置下面的“Dialog DLL”项为“DARMSTM.DLL”;parameter项为“-pSTM32F103C8”,用于设置支持STM32F103C8 的软硬件仿真。
2 程序调试
2.1 无参数
2.1.1 设置断点
2.1.2 编译并调试
点击编译,无警告和错误,编译成功
点击调试按钮,开始调试,部分结果如下图:
调试过程中可以发现R1、R2都逐步变成了0x0000000A,即从0加到了10
2.2 有参数
2.2.1 修改代码
将原汇编代码的Init_1函数,传入一个整型x,函数运行后返回整形x+100
修改后如下
#include<stdio.h>
extern int Init_1(int x);
int main()
{
int xx = Init_1(10);
printf("%d", xx);
return 0;
}
AREA MY_FUNCTION,CODE,READONLY
EXPORT Init_1
Init_1
ADD R1,#100
MOV PC,LR
LOOP
CMP R1,#10
BHS LOOP_END
ADD R2,#1
ADD R1,#1
B LOOP
LOOP_END
NOP
END
2.2.2 编译并调试
-
设置断点 -
调试结果
总结
调试过程中一定要注意很多细节,例如call stack+locals窗口显示会给出main的主要信息
|