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语言优化后,从汇编代码就能看出函数的执行时间、时序等,现在迷茫了。大家知道这是什么原因吗?谢谢了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
n0831
1楼-- · 2020-01-27 14:17
软件仿真下看看。
richu
2楼-- · 2020-01-27 15:55
n0831 发表于 2013-8-27 19:39
软件仿真下看看。

软件仿真看了,是严格按照生成的汇编执行的,间隔时间也是2.52us,和用示波器看的不一致。
dz20062008
3楼-- · 2020-01-27 21:00
本帖最后由 dz20062008 于 2013-8-28 00:38 编辑

不是完整的汇编代码,完整的汇编代码第一条是跳转指令,加上执行了才会有输出。为什么第一条必须是跳转了?因为头三字节后是中断的入口不能作为其它用途。需要精确的时序干嘛用c了?直接汇编就可以了
richu
4楼-- · 2020-01-28 01:12
 精彩回答 2  元偷偷看……
dz20062008
5楼-- · 2020-01-28 06:01
richu 发表于 2013-8-28 18:28
谢谢,以上的代码只是源文件的一部分,对应的汇编代码也只是其中一段。现在的问题是:C语言经过编译后生 ...

直接用汇编写一个简单的方波分析时序。不要夹杂C的因素在里面。用汇编可以精确到一个机器周期,因为51指令集最短的是单周期指令,当然伪指令不算的
cocom
6楼-- · 2020-01-28 07:07
要算得这样精确,就先要看数据手册,想当然的就不要做设计,做党官是最好的选择。
C8051F的 CJNE     R7,#0x14,C:03DE 指令,不等于时的执行时间是4个时钟周期,等于时为3个时钟周期。
这样的话你再算算看。

一周热门 更多>