
结合本人的使用,有些心得想与大家交流,如有帮助,我很高兴,如有错误,请指正,我先说声谢谢,先来讲讲for循环,这是最影响执行效率的。 在已知循环次数的情况下一般用for,一般有如下几种用法:for (i=5;i>0;i--);for (i=0;i<5;i++);for(i=5;--i;);for(i=5;i>0;--i)。它们的用法和代码为: for (i=5;i>0;i--): void loop(void) { unsigned char i; unsigned int j = 5; for (i=5;i>0;i--) { j++; } } 它生成的代码为: movlw 5 clrf 3 ;select bank 0 movwf ?a_loop+1 clrf ?a_loop+2 movwf ?a_loop l3 incf ?a_loop+1 btfsc 3,2 incf ?a_loop+2 decfsz ?a_loop goto l3 return 此代码几乎与汇编写出来的一样,推荐! for (i=0;i<5;i++): void loop(void) { unsigned char i; unsigned int j = 5; for (i=0;i<5;i++) { j++; } } 它生成的代码为: movlw 5 clrf 3 ;select bank 0 movwf ?a_loop+1 clrf ?a_loop+2 clrf ?a_loop l3 incf ?a_loop+1 btfsc 3,2 incf ?a_loop+2 incf ?a_loop movlw 5 subwf ?a_loop,w btfsc 3,0 return goto l3 代码非常冗长,且不好理解,循环体内有7条语句。 for(i=5;--i;): void loop(void) { unsigned char i; unsigned int j = 5; for(i=5;--i;) { j++; } } 它生成的代码为: movlw 5 clrf 3 ;select bank 0 movwf ?a_loop+1 clrf ?a_loop+2 movwf ?a_loop goto l6 13 incf ?a_loop+1 btfsc 3,2 incf ?a_loop+2 l6 decfsz ?a_loop goto l3 return 代码也比较简洁,但不太直观。 for(i=5;i>0;--i): void loop(void) { unsigned char i; unsigned int j = 5; for(i=5;i>0;--i) { j++; } } 它生成的代码为: movlw 5 clrf 3 ;select bank 0 movwf ?a_loop+1 clrf ?a_loop+2 movwf ?a_loop l3 incf ?a_loop+1 btfsc 3,2 incf ?a_loop+2 decfsz ?a_loop goto l3 return 此代码与for (i=5;i>0;i--)生成的一样,也非常高效,次推荐。 综上所述,推荐用for (i=5;i>0;i--),它生成的代码完全与汇编一模一样,而且本身语法也比较直观。次推荐for (i=5;i>0;i--)。(待续。。。) |