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语言优化后,从汇编代码就能看出函数的执行时间、时序等,现在迷茫了。大家知道这是什么原因吗?谢谢了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。