搜索
bottom↓
回复: 7

C8051F在keil下编译后,汇编代码与实际执行效果不一致

[复制链接]

出0入0汤圆

发表于 2013-8-27 16:34:29 | 显示全部楼层 |阅读模式
大家好:
      今天在Keil下调试C8051F410,发现编译后的汇编代码与实际执行效果不一致,为了验证这个问题,用以下简单的代码进行了验证,发现确实存在问题,无法理解,具体如下:
      Keil下有以下代码:
                LED = 1;
                for(i=0;i<20;i++);
                LED = 0;

编译链接后查看汇编代码为:
    45:                 LED = 1;
C:0x03DA    D287     SETB     LED(0x80.7)
    46:                 for(i=0;i<20;i++);
C:0x03DC    E4       CLR      A
C:0x03DD    FF       MOV      R7,A
C:0x03DE    0F       INC      R7
C:0x03DF    BF14FC   CJNE     R7,#0x14,C:03DE
    47:                 LED = 0;
C:0x03E2    C287     CLR      LED(0x80.7)

其中SETB、CLR、MOV、INC均为单周期指令,而CJNE为双周期指令,所以LED电平翻转的间隔大概为63个指令周期(1+1+1+20*(1+2)=63),系统时钟用的是外部25MHz晶振,C8051F内核的指令周期为1个系统时钟周期,所以LED电平翻转的间隔应该为2.52us(63/25us)。]但是用示波器测试,此间隔时间并不是2.52us,而是5us左右

一直觉得C语言优化后,从汇编代码就能看出函数的执行时间、时序等,现在迷茫了。大家知道这是什么原因吗?谢谢了!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入42汤圆

发表于 2013-8-27 19:39:56 来自手机 | 显示全部楼层
软件仿真下看看。

出0入0汤圆

 楼主| 发表于 2013-8-27 20:47:48 | 显示全部楼层
n0831 发表于 2013-8-27 19:39
软件仿真下看看。

软件仿真看了,是严格按照生成的汇编执行的,间隔时间也是2.52us,和用示波器看的不一致。

出145入215汤圆

发表于 2013-8-28 00:35:14 来自手机 | 显示全部楼层
本帖最后由 dz20062008 于 2013-8-28 00:38 编辑

不是完整的汇编代码,完整的汇编代码第一条是跳转指令,加上执行了才会有输出。为什么第一条必须是跳转了?因为头三字节后是中断的入口不能作为其它用途。需要精确的时序干嘛用c了?直接汇编就可以了

出0入0汤圆

 楼主| 发表于 2013-8-28 18:28:40 来自手机 | 显示全部楼层
dz20062008 发表于 2013-8-28 00:35
不是完整的汇编代码,完整的汇编代码第一条是跳转指令,加上执行了才会有输出。为什么第一条必须是跳转了? ...

谢谢,以上的代码只是源文件的一部分,对应的汇编代码也只是其中一段。现在的问题是:C语言经过编译后生成了汇编代码,但是此汇编代码的执行与实际测量的结果有很大差异。

出145入215汤圆

发表于 2013-8-28 20:37:21 | 显示全部楼层
richu 发表于 2013-8-28 18:28
谢谢,以上的代码只是源文件的一部分,对应的汇编代码也只是其中一段。现在的问题是:C语言经过编译后生 ...

直接用汇编写一个简单的方波分析时序。不要夹杂C的因素在里面。用汇编可以精确到一个机器周期,因为51指令集最短的是单周期指令,当然伪指令不算的

出0入42汤圆

发表于 2013-8-28 21:31:33 | 显示全部楼层
要算得这样精确,就先要看数据手册,想当然的就不要做设计,做党官是最好的选择。
C8051F的 CJNE     R7,#0x14,C:03DE 指令,不等于时的执行时间是4个时钟周期,等于时为3个时钟周期。
这样的话你再算算看。

出0入0汤圆

 楼主| 发表于 2013-8-29 13:18:40 | 显示全部楼层
谢谢各位,C8051F用的是CIP-51指令集,与标准51单片机的MCS-51指令集兼容,但在执行时还是有些区别的。比如CJNE     R7,#0x14,C:03DE指令,像“cocom”提到的那样,执行的时间为3或4个时钟周期,而不是两个时钟周期。值得说明的是,在Keil下仿真时,虽然用到的是C8051F系列的芯片,但CJNE     R7,#0x14,C:03DE指令是按照MCS-51下的指令周期计算的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 05:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表