KeilC查看c51对应的汇编指令并分析c51语句的执行时间

.c文件代码:
在这里插入图片描述

1.开启调试
调试->启动/停止调试
在这里插入图片描述
2.打开反汇编窗口
可以点 :调试->在线汇编
或点快捷键
在这里插入图片描述
得到如下c51语句对应的汇编指令
在这里插入图片描述
c51语句下面的就是对应的汇编指令
1.main函数对应的指令,由指令知道跳转到delay()
在这里插入图片描述
2.
C:0x000F E4 CLR A//将寄存器A中数据置0
C:0x0010 FF MOV R7,A//将A中的数据给寄存器R7
这里没有执行for循环括号中的内容

在这里插入图片描述
3.执行for循环括号中的内容,从这里可以知道这里执行了两条指令,也就是2个机器周期(1个机器周期为12个时钟周期),共24个时钟周期,根据晶振频率可以知道循环一次的时间;通过增加循环次数,从而做到指定时间的延时效果

在这里插入图片描述
4.最后执行到delay()函数最后的大括号所执行的指令

在这里插入图片描述



分析运行时间
选择第3点分析运行时间:
在这里插入图片描述
这个空for循环执行了两条汇编指令(一条汇编指令并不对应一个机器周期,有可能对应多个机器周期)
通过查询下面的汇编指令表可以知道:
C:0x0011 0F INC R7,这是一条自增指令,R7寄存器加1,对应1个机器周期。
C:0x0012 BFDCFC CJNE R7,#0xDC,C:0011,这是一条控制转移类指令,比较寄存器R7和立即数#0xDC(即我们设置的循环上限220),不相等转移到C:0011(即汇编指令:C:0x0011 0F INC R7处),该指令的执行占用2个机器周期。

一个空for循环共占用3个机器周期,220个循环占用660个机器周期,即66012=7920个晶振周期,若单片机的晶振为12MHZ,则该for循环延时为:7920/(1210^6) =660 * 10^-6 s=0.66 ms。

但是我认为这样也只能大约估计,因为c51语言在编译时并不会生成汇编指令,而是生成适应单片机的机器码(机器码一定可以找到对应的汇编指令,因为汇编指令就是机器指令的一种助记符),c51中的反汇编出来的汇编指令并不一定准确,并不能完全代表实际执行的机器指令。



如果想知道该语句实际的运行时间,可以使用一下方式:
1.在for循环上下插入断点,并开始调试。

在这里插入图片描述
2.点击运行 ,在第一个调试点停止,查看当前时间sec,为0.00039100 s
在这里插入图片描述
再次运行,在第二个调试点停止,sec=0.00105300 s,
有res中r7=0xdc=220知道for循环确实循环了220次,
则该语句总的运行时间约为:0.00105-0.00039=0.00066 s=0.66 ms,这个结果与上面分析出来的结果基本一致。
在这里插入图片描述

直接得到某一c51语句占用的机器周期数量
在上面都是通过分析知道执行一条汇编指令占用的机器周期数,实际上直接通过states就可以知道,你运行汇编指令或c51语句,states会相应的增加,通过与上面通过调试得到sec的方法也可以知道for循环期间共执行了多少条机器指令:1053-391=662,共占用662个机器周期,与分析时得到的数据吻合。
同样通过单步调试可以知道某一c51语句或某一汇编指令所占用的机器周期数

以下附上常用的单片机汇编指令表:
链接:https://wenku.baidu.com/view/e2eca2f54b35eefdc9d33308.html

http://www.51hei.com/bbs/dpj-157395-1.html
在这里插入图片描述

注:由于对汇编语言和单片机还不是很了解,有误请说明。

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值