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