1 / 12
文档名称:

C51优化设计之循环语句(上)——使用DJNZ循环指令提高执行效率.doc

格式:doc   大小:27KB   页数:12页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

C51优化设计之循环语句(上)——使用DJNZ循环指令提高执行效率.doc

上传人:文库旗舰店 2019/9/14 文件大小:27 KB

下载得到文件列表

C51优化设计之循环语句(上)——使用DJNZ循环指令提高执行效率.doc

相关文档

文档介绍

文档介绍:C51优化设计之循环语句(上)——使用DJNZ循环指令提高执行效率[原创]主题词:高效代码;循环语句;KeilC51;DJNZC51有三种循环语句即while,do-while和for,这三种循环都可以用来处理同一问题,,如果不注意51汇编指令的特点,不同的编程方式可能得到不同的程序性能(执行速度和代码长度).以计算1+2+3+...+9+10为例,:unsignedchari;unsignedcharsum;for(i=1,sum=0;i<11;i++){sum+=i;}汇编代码为:C:0x00037F01MOVR7,#0x01C:0x0005E4CLRAC:0x0006FEMOVR6,AC:0x0007EFMOVA,R7C:0x00082EADDA,R6C:0x0009FEMOVR6,AC:0x000A0FINCR7C:0x000BBF0BF9CJNER7,#0x0B,C:0007代码长度(字节):11,执行周期(机器周期):63程序2:unsignedchari;unsignedcharsum;for(i=10,sum=0;i;i--){sum+=i;}汇编代码为:C:0x000F7F0AMOVR7,#0x0AC:0x0011E4CLRAC:0x0012FEMOVR6,AC:0x0013EFMOVA,R7C:0x00142EADDA,R6C:0x0015FEMOVR6,AC:0x0016DFFBDJNZR7,C:0013代码长度(字节):9,执行周期(机器周期):53程序3:unsignedchari=11;unsignedcharsum=0;while(i--){sum+=i;}汇编代码为:C:0x00037F0AMOVR7,#0x0BC:0x0005E4CLRAC:0x0006FEMOVR6,AC:0x0007AD07MOVR5,0x07C:0x00091FDECR7C:0x000AEDMOVA,R5C:0x000B6005JZC:0012C:0x000DEFMOVA,R7C:0x000E2EADDA,R6C:0x000FFEMOVR6,AC:0x001080F5SJMPC:0007代码长度(字节):15,执行周期(机器周期):130从以上三个不同程序可以看出,其运算结果都是0x37(55),但最短代码为9,最长代码为15,最快速度为53,最慢速度为130,?,循环控制指令使用了DJNZ循环转移指令,该指令同时完成计数和循环判断两种操作,而且只占用两个字节,是51指令系统中最为高效的循环指令,因此在设计循环程序时,,,因此循环程序必须采用递减方式才有可能编译出DJNZ指令,,因此设计循环程序也必须坚持先减后判断的原则,否则得不到DJNZ指令,:unsignedchari=10;unsignedcharsum=0;while(i){sum+=i;i--;}--后还有其它操作,比如改为:unsignedchari=10,j=0;unsignedcharsum=0;while(i){sum+=i;i--;j++;}也得不到DJNZ汇编指令,也就是说,循环语句在执行过程中,减1与判断必须是连续的,且减1在前,,当将减1与判断合成一步时,应当采用while(--i).按照以上所述,do-while循环同样可以汇编出DJNZ指令,,而是来自于另一个变量时,for和while语句无论采用何种控制流程都不能产生DJNZ指令,因为这两种循环都是先判断后执行的控制逻辑,,只有do-while语句符合这个条件,因此当循环次数不是常量而是变量时,就必须使用do-,若要使用DJNZ指令提高程序效率,在设计循环程序中应坚持以下三大原则:①采用递减计数;②先减后判断,减与判断连续进行;③循环次数为变量时,采用do-——优化级别7与8难以两全导致垃圾代码[原创]主题词:KeilC51;优化级别(优化等级);垃圾代码;OPTIMIZE注:文中提到的