|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
goto語句 |
| 作者:衷政偉 欄目:單片機(jī) |
見圖 goto沒有轉(zhuǎn)為相應(yīng)的匯編代碼
|
| 2樓: | >>參與討論 |
| 作者: computer00 于 2006/7/31 14:12:00 發(fā)布:
是嗎?我想0x000E就是D2。 如果P34等于1,就跳轉(zhuǎn)到D2, 那編譯之后剛好不就是 JB P34,C:000E 嗎? |
|
| 3樓: | >>參與討論 |
| 作者: 平常人 于 2006/7/31 14:27:00 發(fā)布:
goto語句——多說一句 沒看到你下面的程序,似乎你的 goto 應(yīng)該可以改為 break 。 |
|
| 4樓: | >>參與討論 |
| 作者: 衷政偉 于 2006/7/31 14:31:00 發(fā)布:
剛發(fā)錯了圖片 剛發(fā)錯了圖片 goto沒有相應(yīng)的匯編代碼 源代碼如下: #include <reg51.h> sbit P10 = P1^0; sbit P11 = P1^1; sbit P34 = P3^4; sbit P35 = P3^5; void delay10ms(void) { unsigned CHAR i, j; for (i=50; i>0; i--) { for (j=200; j>0; j--) { ; } } } void main(void) { while (1) { D1: if (P34==1) { goto D2; } else { delay10ms(); if (P34==0) { P10 = !P10; if (P34==0) { ; } else { goto D2; } } else { goto D1; } } D2: if (P35==1) { goto D1; } else { delay10ms(); if (P35==0) { P11 = !P11; if (P35==0) { ; } else { goto D1; } } else { goto D2; } } } }
|
|
| 5樓: | >>參與討論 |
| 作者: computer00 于 2006/7/31 15:15:00 發(fā)布:
編譯器比你"聰明",是你自己沒看清楚而已 22: while (1) 23: { 24: D1: if (P34==1) C:0x0003 20B408 JB P34(0xB0.4),C:000E 這里我們可以看到,如果P34等于1,就跳轉(zhuǎn)到000E,而000E剛好是標(biāo)號D2的地址 25: { 26: goto D2; 所以這個if(P34==1)就goto到D2是有的 27: } 28: 29: else 30: { 31: delay10ms(); 32: C:0x0006 12002A LCALL delay10ms(C:002A) 33: if (P34==0) C:0x0009 20B4F7 JB P34(0xB0.4),main(C:0003) 這條語句的意思就是,如果P34等于1,則跳轉(zhuǎn)到0003,而0003則是D1的標(biāo)號.即,當(dāng)P34等于1時跳轉(zhuǎn)到D1,等于0時,不跳轉(zhuǎn),即順序執(zhí)行,所以,如果P34等于0,則執(zhí)行下面的P10=!P10.而如果不等于0,即等于1,那么就跳轉(zhuǎn)到0003,即跳轉(zhuǎn)到D1,而這個剛好就是下面的那條else goto D1 34: { 35: P10 = !P10; 36: C:0x000C B290 CPL P10(0x90.0) 37: if (P34==0) 38: { 39: ; 40: } 41: 42: else 43: { 44: goto D2; 這里無論條件P34==0是否成立,都會執(zhí)行到D2去的,并且接下來馬上就是D2,所以干脆就不跳了,跳了也是白跳. 45: } 46: } 47: 48: else 49: { 50: goto D1; 這個在上面已經(jīng)說明了,會跳轉(zhuǎn)到0003 51: } 52: } 53: 54: 55: D2: if (P35==1) C:0x000E 20B5F2 JB P35(0xB0.5),main(C:0003) 這個同上 56: { 57: goto D1; 58: } 59: |
|
| 6樓: | >>參與討論 |
| 作者: 衷政偉 于 2006/7/31 19:07:00 發(fā)布:
謝謝 |
|
| 7樓: | >>參與討論 |
| 作者: 平常人 于 2006/7/31 22:42:00 發(fā)布:
很多GOTO都可以省掉 首先,在D1處,將條件反一下就可以把你的第一個GOTO省掉: D1: if (P34 != 1) { delay10ms(); ...... } D2: 另一個辦法是把第一個GOTO換成一個分號: D1: if (P34 == 1) ; else { delay10ms(); ...... } 盡量不要把if語句的then部分做得比else部分短很多,這樣程序看起來很別扭,只需簡單地把條件反一下即可。這樣還有很大可能得到更優(yōu)化的編譯結(jié)果,你可以照我說的試一試。 其他的GOTO還有其他的方法省掉。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |