同是两个FOR循环延时1毫秒,反汇编一个用CJNE,一个用JNZ,不可以盲目套用时间计算公式

函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 

void delaynms(unsigned char n)
 {
   unsigned char i;
    for(i=0;i<n;i++)
       delay1ms();
 }

反汇编:

   119:          for(i=0;i<10;i++) 

C:0x02E5    E4       CLR      A
C:0x02E6    FF       MOV      R7,A
   120:           for(j=0;j<33;j++) 
   121:            ;          
C:0x02E7    E4       CLR      A
C:0x02E8    FE       MOV      R6,A
C:0x02E9    0E       INC      R6
C:0x02EA    BE21FC   CJNE     R6,#0x21,C:02E9
C:0x02ED    0F       INC      R7
C:0x02EE    BF0AF6   CJNE     R7,#0x0A,C:02E7(外层循环用的CJNE,红色的都是内层的循环)
   122:  } 
C:0x02F1    22       RET      

------------------------

内层循环一个循环近似于8个时钟周期8*120=960近似1毫秒

   unsigned int x,y;
           for(x=1;x>0;x--)
           { for(y=0;y<120;y++)     
                ;
              }

反汇编:

    19:            for(x=1;x>0;x--) 
C:0x0003    750800   MOV      0x08,#0x00
C:0x0006    750901   MOV      0x09,#0x01
    20:            { for(y=0;y<120;y++)          
    21:                         ; 
C:0x0009    E4       CLR      A
C:0x000A    F50A     MOV      0x0A,A
C:0x000C    F50B     MOV      0x0B,A
C:0x000E    050B     INC      0x0B
C:0x0010    E50B     MOV      A,0x0B
C:0x0012    7002     JNZ      C:0016
C:0x0014    050A     INC      0x0A
C:0x0016    6478     XRL      A,#0x78
C:0x0018    450A     ORL      A,0x0A
C:0x001A    70F2     JNZ      C:000E
    22:                   } 
C:0x001C    E509     MOV      A,0x09

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值