入门汇编,学了汇编的断点使用做个记录
参考
Keil的调试命令、在线汇编与断点设置等调试方法介绍_Phenixyf的博客-CSDN博客
Keil断点进阶用法,不看后悔_keil变量变化后自动断点_Somnus陳的博客-CSDN博客
Keil自带帮助
Breakpoints Window的用法Keil自带的帮助文档里面就有,只不过是C语言的,汇编的也差不多一样,我这里只是参考着用起来了做个记录。
C8051F330的片内存储组织图
调试代码方便拷贝
CSEG AT 40h ;Coda代码区数据,也就是Flash,可以读,写的话需要先开启Flash写模式
EQU_Data EQU 2 ;这个值是不可改变的
CSEG_40_Data: DB 40h
CSEG_41_Data: DB EQU_Data
DSEG AT 30h ;Data数据内存区,可以读写
DSEG_30_Data: DS 1
ISEG AT 080h ;间接寻址可以读写
ISEG_80_Data: DS 1
CSEG AT 00h
MOV DPTR, #CSEG_40_Data ;代码区通过 Movc和DPTR读取
CLR A
MOVC A, @A+DPTR
MOV R0, #ISEG_80_Data ;Idata数据区,通过通用寄存器间接读取
MOV B,@R0
MOV B,@R0
MOV B,@R0
MOV B,@R0
MOV @R0,#0x88
MOV @R0, A ;这里A=CSEG_40_Data=0x40
MOV CKCON,#0x01 ;SFR寄存器,直接读写
MOV R0,#0
loop:
INC R0
MOV DSEG_30_Data,R0 ;Data数据内存区,直接读写
CLR c
MOV A,R0
SUBB A,#05
JC ($+4)
MOV R0,#0
AJMP loop
;;BS \\C8051F330\TEST\DSEG_30_Data == 0x02, 1, "printf(\"DSEG_30_Data=%d %d %d\\n\",DSEG_30_Data,CKCON,ISEG_80_Data)"
END
变量和函数
打断点的方法
1、行断点
行断点就是执行到这一行会中断执行
打断点方法1-工机具栏或者行号左边
进入调试模式
打断点方法2-Breakpoints Window
按快捷键Ctrl+B可以弹出Breakpoints Window
鼠标双击刚才创建的断点可以看到下图的对应关系
可以通过Breakpoints Window直接生成行断点
打断点方法3-BS命令直接生成
上图点Close的时候,左下角的Command窗口会有如下命令打印
BS \\C8051F330\TEST\872, 1 这条就是直接生成行断点的实际命令,可以通过Command直接执行这条命令可以是生成断点
2、函数断点(或者叫标号断点)
执行到某个函数时中断
BS loop, 1
3、执行n次断点
某个函数或者某行代码执行了第N次的时候希望能中断
函数N次
如果希望loop函数执行到第三次的时候中断,方法如下
BS loop, 3
代码行N次
BS \\C8051F330\TEST\879, 3
4、配置断点行为
当配置的条件满足设置的中断条件时,可以配置断点的行为
BreakSet exp , cnt , "cmd" |
前面几个BS命令都是不带“cmd”参数,则默认表示中断,也可以是其他命令,或者自定义函数,具体参考Keil的帮助文档,这里介绍常用的printf
如在执行到loop函数的时候打印一些变量值
printf("DSEG_30_Data=%d CKCON=%d ISEG_80_Data=%d\n",DSEG_30_Data,CKCON,ISEG_80_Data)
BS loop, 1, "printf(\"DSEG_30_Data=%d ?CKCON=%d ISEG_80_Data=%d\\n\",DSEG_30_Data,CKCON,ISEG_80_Data)"
5、根据表达式条件生成断点
有时候需要根据一些变量的状态来生成断点
如判断DSEG_30_Data == 0x02的时候中断
BS DSEG_30_Data == 0x02, 1
使用相等符号之外,还可以使用>,>=,<,<=,!=(不等于),&(两值按位与),&&(两值相与)等运算符号。
6、读写中断
如果希望在某个变量在被改写成某个值得时候中断或者变量被读取的时候中断
BS Write ISEG_80_Data == 0x40, 1
BS Write ISEG_80_Data, 1 值被修改就中断
BS Write ISEG_80_Data, 2 被修改第二次中断
BS Read ISEG_80_Data, 2 被读取的二次了中断、