大家好:
今天在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语言优化后,从汇编代码就能看出函数的执行时间、时序等,现在迷茫了。大家知道这是什么原因吗?谢谢了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
软件仿真看了,是严格按照生成的汇编执行的,间隔时间也是2.52us,和用示波器看的不一致。
不是完整的汇编代码,完整的汇编代码第一条是跳转指令,加上执行了才会有输出。为什么第一条必须是跳转了?因为头三字节后是中断的入口不能作为其它用途。需要精确的时序干嘛用c了?直接汇编就可以了
直接用汇编写一个简单的方波分析时序。不要夹杂C的因素在里面。用汇编可以精确到一个机器周期,因为51指令集最短的是单周期指令,当然伪指令不算的
C8051F的 CJNE R7,#0x14,C:03DE 指令,不等于时的执行时间是4个时钟周期,等于时为3个时钟周期。
这样的话你再算算看。
一周热门 更多>