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