Keil5的c8051F330汇编代码断点进阶用法

本文介绍了在Keil环境下进行汇编语言编程时如何设置和使用断点,包括行断点、函数断点、执行次数断点以及基于条件和读写操作的断点,详细讲解了各种断点的设置方法和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

入门汇编,学了汇编的断点使用做个记录

参考

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 被读取的二次了中断、

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyhsandy1803

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值