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

2020-01-27 11:23发布

大家好:
      今天在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语言优化后,从汇编代码就能看出函数的执行时间、时序等,现在迷茫了。大家知道这是什么原因吗?谢谢了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
richu
2020-01-28 12:25
谢谢各位,C8051F用的是CIP-51指令集,与标准51单片机的MCS-51指令集兼容,但在执行时还是有些区别的。比如CJNE     R7,#0x14,C:03DE指令,像“cocom”提到的那样,执行的时间为3或4个时钟周期,而不是两个时钟周期。值得说明的是,在Keil下仿真时,虽然用到的是C8051F系列的芯片,但CJNE     R7,#0x14,C:03DE指令是按照MCS-51下的指令周期计算的。

一周热门 更多>