近来碰到了一个很奇怪的问题,switch语句竟然能编译出除数为0的情况,而且进入到除数为0错误里面出不来了!!以下是C和编译出来的汇编程序,有没有高手碰到过类似的问题??<br />C程序:<br />void User_28_Key(uint8 keyvalue)<br />{<br /> uint32 temp;<br /> switch(keyvalue)<br /> { <br /> case LEFT:if((pPage.ColorFlag==0)||(pPage.ColorFlag==1))<br /> pPage.ColorFlag = 9;<br /> else<br /> pPage.ColorFlag--;<br /> break;<br /> case RIGHT:if(pPage.ColorFlag==9)<br /> pPage.ColorFlag = 1;<br /> else<br /> pPage.ColorFlag++;<br /> break;<br /> case UP: if(pPage.ColorFlag==0)<br /> {<br /> pPage.CurrentPage--;<br /> pPage.NumFlag = 0; <br /> }<br /> else<br /> {<br /> temp = Pow[9-pPage.ColorFlag];<br /> if(Diandu[pPage.NumFlag]/temp%10==0)<br /> Diandu[pPage.NumFlag] += 9*temp;<br /> else<br /> Diandu[pPage.NumFlag] -= temp;<br /> } <br /> break;<br /> case DOWN:if(pPage.ColorFlag==0)<br /> {<br /> pPage.CurrentPage = USER_NO+1;<br /> pPage.NumFlag = 0;<br /> }<br /> else<br /> {<br /> temp = Pow[9-pPage.ColorFlag];<br /> if(Diandu[pPage.NumFlag]/temp%10==9)<br /> Diandu[pPage.NumFlag] -= 9*temp;<br /> else<br /> Diandu[pPage.NumFlag] += temp;<br /> } <br /> break;<br /> case ESC: pPage.PrePage = pPage.CurrentPage;<br /> pPage.CurrentPage = OTHER_NO;<br /> pPage.NumFlag = 0;<br /> pPage.ColorFlag = 0;<br /> break;<br /> case ENTER:if(pPage.NumFlag==7)<br /> pPage.NumFlag = 0;<br /> else<br /> pPage.NumFlag++;<br /> pPage.ColorFlag = 0 ;<br /> break;<br /> default: break;<br /> }<br />}<br />以下是编译出来的汇编程序:<br />[0xe92d4ff8] stmfd r13!,{r3-r11,r14}<br />[0xe59f9660] ldr r9,0x800199c0 ; = #0x8003b498<br />[0xe59f9660] ldr r9,0x800199c4 ; = #0x8101329e<br />[0xe596500c] ldr r5,[r6,#0xc]<br />[0xe1a0b000] mov r11,r0<br />[0xe59fa650] ldr r10,0x800199c0 ; = #0x8003b498<br />[0xe5964008] ldr r4,[r6,#8]<br />[0xe2658009] rsb r8,r5,#9<br />[0xe7990108] ldr r0,[r9,r8,lsl #2]<br />[0xeb000757] bl __rt_udiv (1)<br />[0xeb000757] bl 0x8001b0e0 ; (__rt_udiv + 0x4) (2)<br />[0xeb000796] bl 0x8001b1e0 ; (__rt_udiv10 + 0x4) (3)<br />[0xe1a07001] mov r7,r1<br />[0xe3a01000] mov r1,#0<br />[0xe5960000] ldr r0,[r6,#0]<br />[0xe35b0006] cmp r11,#6<br />[0x908ff10b] addls pc,pc,r11,lsl #2<br />[0xea00000b] b 0x800193cc ; (User_28_Key + 0x7c)<br />[0xea00000b] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xea000004] b 0x800193b8 ; (User_28_Key + 0x68)<br />[0xea00000d] b 0x800193e0 ; (User_28_Key + 0x90)<br />[0xea00003a] b 0x80019498 ; (User_28_Key + 0x148)<br />[0xea00003f] b 0x800194b0 ; (User_28_Key + 0x160)<br />[0xea000012] b 0x80019400 ; (User_28_Key + 0xb0)<br />[0xea000024] b 0x8001944c ; (User_28_Key + 0xfc)<br />[0x0a000001] beq 0x800193c4 ; (User_28_Key + 0x74)<br />[0x0a000001] beq 0x800193c8 ; (User_28_Key + 0x78)<br />[0xe3550001] cmp r5,#1<br />[0x1a000002] bne 0x800193d4 ; (User_28_Key + 0x84)<br />[0xe3a00009] mov r0,#9<br />[0xe586000c] str r0,[r6,#0xc]<br />[0xe8bd8ff8] ldmfd r13!,{r3-r11,pc}<br />[0xe2450001] sub r0,r5,#1<br />[0xeafffffb] b 0x800193cc ; (User_28_Key + 0x7c)<br />[0xeafffffb] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe3550009] cmp r5,#9<br />[0x1a000002] bne 0x800193f4 ; (User_28_Key + 0xa4)<br />[0xe3a00001] mov r0,#1<br />[0xe586000c] str r0,[r6,#0xc]<br />[0xeafffff6] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe2850001] add r0,r5,#1<br />[0xeafffff3] b 0x800193cc ; (User_28_Key + 0x7c)<br />[0xeafffff3] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe3550000] cmp r5,#0<br />[0x1a000003] bne 0x80019418 ; (User_28_Key + 0xc8)<br />[0xe2400001] sub r0,r0,#1<br />[0xe5860000] str r0,[r6,#0]<br />[0xe5861008] str r1,[r6,#8]<br />[0xeaffffed] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe79a6104] ldr r6,[r10,r4,lsl #2]<br />[0xe79a6104] ldr r6,[r10,r4,lsl #2]<br />[0xe1a00005] mov r0,r5<br />[0xeb0006c4] bl 0x8001af3c ; (__rt_divtest + 0x4)<br />[0xe3570000] cmp r7,#0<br />[0x1a000003] bne 0x80019440 ; (User_28_Key + 0xf0)<br />[0xe0850185] add r0,r5,r5,lsl #3<br />[0xe0860000] add r0,r6,r0<br />[0xeaffffe3] b 0x800193cc ; (User_28_Key + 0x7c)<br />[0xeaffffe3] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe0460005] sub r0,r6,r5<br />[0xe78a0104] str r0,[r10,r4,lsl #2]<br />[0xeaffffe0] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe3550000] cmp r5,#0<br />[0x1a000003] bne 0x80019464 ; (User_28_Key + 0x114)<br />[0xe3a00010] mov r0,#0x10<br />[0xe5861008] str r1,[r6,#8]<br />[0xe5861008] str r1,[r6,#8]<br />[0xeaffffda] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe7995108] ldr r5,[r9,r8,lsl #2]<br />[0xe79a6104] ldr r6,[r10,r4,lsl #2]<br />[0xe1a00005] mov r0,r5<br />[0xeb0006b1] bl 0x8001af3c ; (__rt_divtest + 0x4)<br />[0xe3570009] cmp r7,#9<br />[0xe0850185] add r0,r5,r5,lsl #3<br />[0xe0850185] add r0,r5,r5,lsl #3<br />[0xe0460000] sub r0,r6,r0<br />[0xe78a0104] str r0,[r10,r4,lsl #2]<br />[0xeaffffd0] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe0860005] add r0,r6,r5<br />[0xe78a0104] str r0,[r10,r4,lsl #2]<br />[0xeaffffcd] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe3a0003f] mov r0,#0x3f<br />[0xe3a0003f] mov r0,#0x3f<br />[0xe5860000] str r0,[r6,#0]<br />[0xe5861008] str r1,[r6,#8]<br />[0xe586100c] str r1,[r6,#0xc]<br />[0xeaffffc7] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe3540008] cmp r4,#8<br />[0x1a000001] bne 0x800194c0 ; (User_28_Key + 0x170)<br />[0xea000001] b 0x800194c4 ; (User_28_Key + 0x174)<br />[0xea000001] b 0x800194c8 ; (User_28_Key + 0x178)<br />[0xe2840001] add r0,r4,#1<br />[0xe5860008] str r0,[r6,#8]<br />[0xe586100c] str r1,[r6,#0xc]<br />[0xeaffffbf] b 0x800193d0 ; (User_28_Key + 0x80)<br />[0xe92d4070] stmfd r13!,{r4-r6,r14}<br />[0xe51feaac] ldr r14,0x80018a30 ; = #0x000001b6<br />[0xe59e000c] ldr r0,[r14,#0xc]<br />[0xe59e000c] ldr r0,[r14,#0xc]<br />[0xe3e01003] mvn r1,#3<br />[0xe59f44dc] ldr r4,0x800199c8 ; = #0x00000313<br />[0xe0812100] add r2,r1,r0,lsl #2<br />[0xe1d410b0] ldrh r1,[r4,#0]<br />[0xe3a05001] mov r5,#1<br />[0xe1a03215] mov r3,r5,lsl r2<br />[0xe1a0c231] mov r12,r1,lsr r2<br />[0xe1a0c231] mov r12,r1,lsr r2<br />[0x908ff106] addls pc,pc,r6,lsl #2<br /><br /><br />怎么会编译出(1),(2),(3)这三步呢??还有几个函数跟上述函数类似,都没有这样的问题,就这个函数是这样的,真的很奇怪,左看右看,都没有什么问题啊,找了一两天了,高手请赐教!!<br /> |
|