|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
奇怪,ADS編譯的有問題了?? |
| 作者:gaowenbiao 欄目:ARM技術(shù) |
近來碰到了一個(gè)很奇怪的問題,SWITCH語句竟然能編譯出除數(shù)為0的情況,而且進(jìn)入到除數(shù)為0錯(cuò)誤里面出不來了!以下是C和編譯出來的匯編程序,有沒有高手碰到過類似的問題?? C程序: void User_28_Key(uint8 keyvalue) { uint32 TEMP; SWITCH(keyvalue) { case LEFT:if((pPage.ColorFlag==0)||(pPage.ColorFlag==1)) pPage.ColorFlag = 9; else pPage.ColorFlag--; break; case RIGHT:if(pPage.ColorFlag==9) pPage.ColorFlag = 1; else pPage.ColorFlag++; break; case UP: if(pPage.ColorFlag==0) { pPage.CurrentPage--; pPage.NumFlag = 0; } else { TEMP = Pow[9-pPage.ColorFlag]; if(Diandu[pPage.NumFlag]/TEMP%10==0) Diandu[pPage.NumFlag] += 9*TEMP; else Diandu[pPage.NumFlag] -= TEMP; } break; case DOWN:if(pPage.ColorFlag==0) { pPage.CurrentPage = USER_NO+1; pPage.NumFlag = 0; } else { TEMP = Pow[9-pPage.ColorFlag]; if(Diandu[pPage.NumFlag]/TEMP%10==9) Diandu[pPage.NumFlag] -= 9*TEMP; else Diandu[pPage.NumFlag] += TEMP; } break; case ESC: pPage.PrePage = pPage.CurrentPage; pPage.CurrentPage = OTHER_NO; pPage.NumFlag = 0; pPage.ColorFlag = 0; break; case ENTER:if(pPage.NumFlag==7) pPage.NumFlag = 0; else pPage.NumFlag++; pPage.ColorFlag = 0 ; break; default: break; } } 以下是編譯出來的匯編程序: [0xe92d4ff8] stmfd r13!,{r3-r11,r14} [0xe59f9660] ldr r9,0x800199c0 ; = #0x8003b498 [0xe59f9660] ldr r9,0x800199c4 ; = #0x8101329e [0xe596500c] ldr r5,[r6,#0xc] [0xe1a0b000] mov r11,r0 [0xe59fa650] ldr r10,0x800199c0 ; = #0x8003b498 [0xe5964008] ldr r4,[r6,#8] [0xe2658009] rsb r8,r5,#9 [0xe7990108] ldr r0,[r9,r8,lsl #2] [0xeb000757] bl __rt_udiv (1) [0xeb000757] bl 0x8001b0e0 ; (__rt_udiv + 0x4) (2) [0xeb000796] bl 0x8001b1e0 ; (__rt_udiv10 + 0x4) (3) [0xe1a07001] mov r7,r1 [0xe3a01000] mov r1,#0 [0xe5960000] ldr r0,[r6,#0] [0xe35b0006] cmp r11,#6 [0x908ff10b] addls pc,pc,r11,lsl #2 [0xea00000b] b 0x800193cc ; (User_28_Key + 0x7c) [0xea00000b] b 0x800193d0 ; (User_28_Key + 0x80) [0xea000004] b 0x800193b8 ; (User_28_Key + 0x68) [0xea00000d] b 0x800193e0 ; (User_28_Key + 0x90) [0xea00003a] b 0x80019498 ; (User_28_Key + 0x148) [0xea00003f] b 0x800194b0 ; (User_28_Key + 0x160) [0xea000012] b 0x80019400 ; (User_28_Key + 0xb0) [0xea000024] b 0x8001944c ; (User_28_Key + 0xfc) [0x0a000001] beq 0x800193c4 ; (User_28_Key + 0x74) [0x0a000001] beq 0x800193c8 ; (User_28_Key + 0x78) [0xe3550001] cmp r5,#1 [0x1a000002] bne 0x800193d4 ; (User_28_Key + 0x84) [0xe3a00009] mov r0,#9 [0xe586000c] str r0,[r6,#0xc] [0xe8bd8ff8] ld |
| 2樓: | >>參與討論 |
| 作者: zlgARM 于 2007/5/14 22:37:00 發(fā)布:
gaowenbiao 注意加一下括號吧,不要依賴編譯器設(shè)定的優(yōu)先級。 同時(shí)我們都知道用變量做除數(shù)的話,必須檢查它是不是為0的,您也應(yīng)該檢查。 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |