C51优化设计之循环语句〔上〕–使用DJNZ循环指令提高执行效率.docVIP

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

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C51优化设计之循环语句〔上〕–使用DJNZ循环指令提高执行效率

C51优化设计之循环语句(上)——使用DJNZ循环指令提高执行效率[原创]??? 主题词:高效代码;循环语句;Keil C51;DJNZ C51有三种循环语句即while,do-while和for,这三种循环都可以用来处理同一问题,基本上三者可以相互替换.但由于C51是针对51汇编语言的编译器,如果不注意51汇编指令的特点,不同的编程方式可能得到不同的程序性能(执行速度和代码长度).以计算1+2+3+...+9+10为例,下面做一对比. 程序1: ??? unsigned char i; ??? unsigned char sum;??? ??? for(i=1,sum=0;i11;i++) ??? { ??? ??? sum+=i; ??? } 汇编代码为: C:0x0003??? 7F01???? MOV????? R7,#0x01 C:0x0005??? E4?????? CLR????? A C:0x0006??? FE?????? MOV????? R6,A C:0x0007??? EF?????? MOV????? A,R7 C:0x0008??? 2E?????? ADD????? A,R6 C:0x0009??? FE?????? MOV????? R6,A C:0x000A??? 0F?????? INC????? R7 C:0x000B??? BF0BF9?? CJNE???? R7,#0x0B,C:0007 代码长度(字节):11,执行周期(机器周期):63 程序2: ??? unsigned char i; ??? unsigned char sum;??? ??? for(i=10,sum=0;i;i--) ??? { ??? ??? sum+=i; ??? } 汇编代码为: C:0x000F??? 7F0A???? MOV????? R7,#0x0A C:0x0011??? E4?????? CLR????? A C:0x0012??? FE?????? MOV????? R6,A C:0x0013??? EF?????? MOV????? A,R7 C:0x0014??? 2E?????? ADD????? A,R6 C:0x0015??? FE?????? MOV????? R6,A C:0x0016??? DFFB???? DJNZ???? R7,C:0013 代码长度(字节):9,执行周期(机器周期):53 程序3: ??? unsigned char i=11; ??? unsigned char sum=0; ??? while(i--) ??? { ??? ??? sum+=i; ??? } 汇编代码为: C:0x0003??? 7F0A???? MOV????? R7,#0x0B C:0x0005??? E4?????? CLR????? A C:0x0006??? FE?????? MOV????? R6,A C:0x0007??? AD07???? MOV????? R5,0x07 C:0x0009??? 1F?????? DEC????? R7 C:0x000A??? ED?????? MOV????? A,R5 C:0x000B??? 6005???? JZ?????? C:0012 C:0x000D??? EF?????? MOV????? A,R7 C:0x000E??? 2E?????? ADD????? A,R6 C:0x000F??? FE?????? MOV????? R6,A C:0x0010??? 80F5???? SJMP???? C:0007 代码长度(字节):15,执行周期(机器周期):130 从以上三个不同程序可以看出,其运算结果都是0x37(55),但最短代码为9,最长代码为15,最快速度为53,最慢速度为130,可见三个程序的性能差异较大. 如何编出占用空间小运行效率高的循环代码呢?在C51编译环境下要写出优秀的循环代码必须熟悉51汇编语言的指令系统.观察程序2,循环控制指令使用了DJNZ循环转移指令,该指令同时完成计数和循环判断两种操作,而且只占用两个字节,是51指令系统中最为高效的循环指令,因此在设计循环程序时,应尽可能使C51将DJNZ用于循环程序中.当然DJNZ指令的循环次数是确定的,主要用在有确定循环次数的情况. DJNZ指令的一个最大特点是递减计数,因此循环程序必须采用递减方式才有可能编译出DJNZ指令,如以上程序2.DJNZ指令的另一个特点是先减后判断,因此设计循环程序也必须坚持先减后判断的原则,否则得不到DJNZ指令,如以上程序3.如果将程序3改写为: ??? unsigned char i=10; ??? un

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档