|
結(jié)合本人的使用,有些心得想與大家交流,如有幫助,我很高興,如有錯誤,請指正,我先說聲謝謝,先來講講for循環(huán),這是最影響執(zhí)行效率的。 在已知循環(huán)次數(shù)的情況下一般用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 代碼非常冗長,且不好理解,循環(huán)體內(nèi)有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--)。 |