全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3133
推到 Plurk!
推到 Facebook!

8051 C語言 在keil c環境下編譯之問題

缺席
p902432
一般會員


發表:3
回覆:13
積分:3
註冊:2007-08-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-11 09:39:42 IP:140.134.xxx.xxx 訂閱
不知各位有沒有遇過這問題
我在用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-11 10:46:07 IP:122.124.xxx.xxx 未訂閱
if((P0 & 0x0f)== 0)
p902432
一般會員


發表:3
回覆:13
積分:3
註冊:2007-08-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-11 21:26:15 IP:140.134.xxx.xxx 訂閱
謝謝

我在編譯成功了一個

不過還有兩個
我在放上來好了

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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-11 23:32:25 IP:59.121.xxx.xxx 訂閱
你注意看一下你的程式, 在 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-11 23:46:00 IP:61.64.xxx.xxx 訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-12 00:10:22 IP:59.121.xxx.xxx 訂閱
這就對了啊, 還沒看出來嗎?

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 就自動作了一個最佳化,
將這三個程式併到一塊了, 比較節省程式碼的空間.
系統時間:2024-05-14 22:22:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!