8051 C語言 在keil c環境下編譯之問題 |
缺席
|
p902432
一般會員 發表:3 回覆:13 積分:3 註冊:2007-08-27 發送簡訊給我 |
不知各位有沒有遇過這問題
我在用c寫程式的時候都沒什麼問題 不過在編譯後進入debug時會直接跳過我要的那一行程式 使我的動作錯誤 是不是我寫程式的觀念錯誤呢? 請各位指點! 由於程式太多 所以我用一段 與編譯出組語來比較 case 2: temp = 1; if(Timer_Count0 <= 0) if(RFDataIn_En == 1 ) { temp = RF_DataIn; if(P0 & 0x0f == 0) RF_state = 3; else RF_state = 0; } break; 115: case 2: 116: temp = 1; C:0x00BA 750B01 MOV temp(0x0B),#0x01 117: if(Timer_Count0 <= 0) C:0x00BD D3 SETB C C:0x00BE E509 MOV A,Timer_Count0(0x09) C:0x00C0 6480 XRL A,#P0(0x80) C:0x00C2 9480 SUBB A,#P0(0x80) C:0x00C4 502F JNC C:00F5 118: if(RFDataIn_En == 1 ) C:0x00C6 30B42C JNB RFDataIn_En(0xB0.4),C:00F5 119: { 120: temp = RF_DataIn; C:0x00C9 E580 MOV A,P0(0x80) C:0x00CB 540F ANL A,#0x0F C:0x00CD F50B MOV temp(0x0B),A 121: if(P0 & 0x0f == 0) //←這行的程式都沒編譯到 122: RF_state = 3; 123: else 124: RF_state = 0; 125: } 126: break; 127: C:0x00CF 8021 SJMP C:00F2 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
p902432
一般會員 發表:3 回覆:13 積分:3 註冊:2007-08-27 發送簡訊給我 |
謝謝
我在編譯成功了一個 不過還有兩個 我在放上來好了 case 2: temp = 1; if(Timer_Count0 <= 0) if(RFDataIn_En == 1 ) { temp = RF_DataIn; if((P0 & 0x0f) == 0) RF_state = 3; else RF_state = 0; } break; 他編出來的結果是 115: case 2: 116: temp = 1; C:0x00BA 750B01 MOV temp(0x0B),#0x01 117: if(Timer_Count0 <= 0) C:0x00BD D3 SETB C C:0x00BE E509 MOV A,Timer_Count0(0x09) C:0x00C0 6480 XRL A,#P0(0x80) C:0x00C2 9480 SUBB A,#P0(0x80) C:0x00C4 5037 JNC C:00FD 118: if(RFDataIn_En == 1 ) C:0x00C6 30B434 JNB RFDataIn_En(0xB0.4),C:00FD 119: { 120: temp = RF_DataIn; C:0x00C9 E580 MOV A,P0(0x80) C:0x00CB 540F ANL A,#0x0F C:0x00CD F50B MOV temp(0x0B),A 121: if((P0 & 0x0f) == 0) C:0x00CF E580 MOV A,P0(0x80) C:0x00D1 540F ANL A,#0x0F C:0x00D3 7025 JNZ C:00FA 122: RF_state = 3; 123: else 這也\編不出來 138: break; 139: C:0x00F8 8000 SJMP C:00FA 請問這是什麼問題 |
bernie_w39
資深會員 發表:3 回覆:199 積分:280 註冊:2007-10-07 發送簡訊給我 |
你注意看一下你的程式, 在 case 3 與 case 4 的結尾部份, 動作均為 RF_state = 0;
我猜 compiler 為了這件事作了一點最佳化, 所以在 asm 中 address 0xFA 的地方 應該可以找到 RF_state = 0; 的對應 asm 118: if(RFDataIn_En == 1 ) C:0x00C6 30B434 JNB RFDataIn_En(0xB0.4),C:00FD 從這兒可以看出, case 結束位址為 0xFD, 而 121: if((P0 & 0x0f) == 0) C:0x00CF E580 MOV A,P0(0x80) C:0x00D1 540F ANL A,#0x0F C:0x00D3 7025 JNZ C:00FA 不成立時是跳到 0xFA, 所以推測那一段程式碼在 0xFA. 只可惜你沒有列出來. |
p902432
一般會員 發表:3 回覆:13 積分:3 註冊:2007-08-27 發送簡訊給我 |
C:0x00F8 8000 SJMP C:00FA
140: default: 141: RF_state = 0; C:0x00FA E4 CLR A C:0x00FB F508 MOV RF_state(0x08),A 142: break; C:0x00FD 22 RET 這是你所說到的程式內容 不過好像也是沒編譯出來 是不是同樣的不能重覆呢? ===================引 用 bernie_w39 文 章=================== 你注意看一下你的程式, 在 case 3 與 case 4 的結尾部份, 動作均為 RF_state = 0; 我猜 compiler 為了這件事作了一點最佳化, 所以在 asm 中 address 0xFA 的地方 應該可以找到 RF_state = 0; 的對應 asm 118: if(RFDataIn_En == 1 ) C:0x00C6 30B434 JNB RFDataIn_En(0xB0.4),C:00FD 從這兒可以看出, case 結束位址為 0xFD, 而 121: if((P0 & 0x0f) == 0) C:0x00CF E580 MOV A,P0(0x80) C:0x00D1 540F ANL A,#0x0F C:0x00D3 7025 JNZ C:00FA 不成立時是跳到 0xFA, 所以推測那一段程式碼在 0xFA. 只可惜你沒有列出來. |
bernie_w39
資深會員 發表:3 回覆:199 積分:280 註冊:2007-10-07 發送簡訊給我 |
這就對了啊, 還沒看出來嗎?
0xFA 那一段就是 RF_state = 0; 以及 switch ... case 的結束 所以 default 是這一段沒有錯, 但是 case 2 if((P0 & 0x0f) == 0) RF_state = 3; else RF_state = 0; 當 if 不成立時, 一樣是作 RF_state = 0 以及 switch ... case 結束 而 case 4 if(Timer_Count0 <= 0) RF_state = 0; break; 一樣是 if 成立之後, 就作 RF_state = 0 以及 switch ... case 結束 因為這三部份的動作一模一樣, 所以 compiler 就自動作了一個最佳化, 將這三個程式併到一塊了, 比較節省程式碼的空間. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |