|
最好從編譯出來的匯編代碼來比較
- 20 void delayus(unsigned char i)
- 21 {
- 22 1 while(i--);
- 23 1 }
- 24 void delayu(unsigned char i)
- 25 {
- 26 1 unsigned char a;
- 27 1 for(a=0; a<i; a++)
- 28 1 {
- 29 2 _nop_();
- 30 2 }
- 31 1 }
- 下面來說說匯編的傳統(tǒng)計(jì)算方法:
-
- 指令周期、機(jī)器周期與時(shí)鐘周期
- 指令周期:CPU執(zhí)行一條指令所需要的時(shí)間稱為指令周期,它是以機(jī)器周期為單位的,指令不同,所需的機(jī)器周期也不同。
- 時(shí)鐘周期:也稱為振蕩周期,一個(gè)時(shí)鐘周期 =晶振的倒數(shù)。
- MCS-51單片機(jī)的一個(gè)機(jī)器周期=6個(gè)狀態(tài)周期=12個(gè)時(shí)鐘周期。
- MCS-單片機(jī)的指令有單字節(jié)、雙字節(jié)和三字節(jié)的,它們的指令周期不盡相同,一個(gè)單周期指令包含一個(gè)機(jī)器周期,即12個(gè)時(shí)鐘周期,所以一條單周期指令被執(zhí)行所占時(shí)間為12*(1/12000000)=1us。
- 了解了上面這些我們來看一個(gè)例子
-
- 匯編延時(shí)子程序的延時(shí)計(jì)算問題
- 對(duì)于程序
- ; FUNCTION _delayus (BEGIN)
- ; SOURCE LINE # 20
- ;---- Variable 'i' assigned to Register 'R7' ----
- ; SOURCE LINE # 21
- ?C0008:
- ; SOURCE LINE # 22
- MOV R6,AR7 ;2指令周期
- DEC R7 ;1指令周期
- MOV A,R6 ;1指令周期
- JNZ ?C0008 ;2指令周期
- ?C0009:
- ; SOURCE LINE # 23
- ?C0010:
- RET ;2指令周期
- ; FUNCTION _delayus (END)
- R7 * (2+1+1+2) + 2
- 整個(gè)循環(huán)執(zhí)行完應(yīng)該是 =(R7 * 6) + 2 指令周期
- ; FUNCTION _delayu (BEGIN)
- ; SOURCE LINE # 24
- ;---- Variable 'i' assigned to Register 'R7' ----
- ; SOURCE LINE # 25
- ; SOURCE LINE # 27
- ;---- Variable 'a' assigned to Register 'R6' ----
- CLR A ;1指令周期
- MOV R6,A ;1指令周期
- ?C0011:
- MOV A,R6 ;1指令周期
- CLR C ;1指令周期
- SUBB A,R7 ;1指令周期
- JNC ?C0014 ;2指令周期
- ; SOURCE LINE # 28
- ; SOURCE LINE # 29
- NOP ;1指令周期
- ; SOURCE LINE # 30
- INC R6 ;1指令周期
- SJMP ?C0011 ;2指令周期
- ; SOURCE LINE # 31
- ?C0014:
- RET ;2指令周期
- ; FUNCTION _delayu (END)
- (1+1+1+2)+ R7 * (1+1+2+1+1+1+2) +1 +1 +2
- 整個(gè)循環(huán)執(zhí)行完應(yīng)該是 = (R7 * 9) + 9 指令周期
- 還說明一下:
- nop指令或者_(dá)nop_(); 函數(shù)占一個(gè)機(jī)器周期,
- 在stc單片機(jī)的12T模式下一個(gè)機(jī)器周期是一個(gè)振蕩周期的12分頻,如果你的晶振是12MHZ,那你的一個(gè)機(jī)器周期就是1微秒.一個(gè)nop指令的執(zhí)行時(shí)間也就是1US
- 當(dāng)在6T模式(下載的時(shí)候可選擇模式)下12M晶振的時(shí)候,一個(gè)nop就是0.5US了.
復(fù)制代碼 |
|