到ARM公司网站上下一个848版的补丁就好了!是805版编译器的一个BUG!<br />做了以下两程序的测试:<br />程序1<br />文件名test1.c<br />int test(unsigned int d)<br />{<br /> if((d & 0x0fffffff) == 0x05555550)<br /> return 1;<br /> else<br /> return 0;<br />}<br /><br />int main(void)<br />{<br /> volatile int d;<br /><br /> d = test(0xA5555550);<br /><br /> return d;<br />}<br />在805版编译器下编译,生成test1b805.s:<br />(armcc -O1 -S -fs -cpu ARM7TDMI -o test1b805.s test1.c)<br /><br />; generated by ARM C Compiler, ADS1.2 [Build 805]<br /><br />; commandline [-O1 -S -fs "-IC:Program FilesARMADSv1_2INCLUDE"]<br /> CODE32<br /><br /> AREA ||.text||, CODE, READONLY<br /><br /> test PROC<br />;;;1 int test(unsigned int d)<br />;;;2 {<br />000000 e59f1020 LDR r1,|L1.40|<br />;;;3 if((d & 0x0fffffff) == 0x05555550)<br />000004 e1a00200 MOV r0,r0,LSL #4<br />000008 e1500221 CMP r0,r1,LSR #4<br />00000c 1a000001 BNE |L1.24|<br />;;;4 return 1;<br />000010 e3a00001 MOV r0,#1<br /> |L1.20|<br />000014 e1a0f00e MOV pc,lr<br />;;;5 else<br />;;;6 return 0;<br /> |L1.24|<br />000018 e3a00000 MOV r0,#0<br />00001c eafffffc B |L1.20|<br />;;;7 }<br /> ENDP<br /><br /> main PROC<br />;;;9 int main(void)<br />;;;10 {<br />000020 e59f0004 LDR r0,|L1.44|<br />;;;11 volatile int d;<br />;;;12 <br />;;;13 d = test(0xA5555550);<br />000024 eafffffe B test<br /> |L1.40|<br />000028 05555550 DCD 0x05555550<br /> |L1.44|<br />00002c a5555550 DCD 0xa5555550<br />;;;14 <br />;;;15 return d;<br />;;;16 }<br /> ENDP<br /><br /><br /><br /> END<br /><br />在848版下编译生成test1b848.s<br />(armcc -O1 -S -fs -cpu ARM7TDMI -o test1b848.s test1.c)<br />; generated by ARM C Compiler, ADS1.2 [Build 848]<br /><br />; commandline [-O1 -S -fs "-IC:Program FilesARMADSv1_2INCLUDE"]<br /> CODE32<br /><br /> AREA ||.text||, CODE, READONLY<br /><br /> test PROC<br />;;;1 int test(unsigned int d)<br />;;;2 {<br />000000 e59f1020 LDR r1,|L1.40|<br />;;;3 if((d & 0x0fffffff) == 0x05555550)<br />000004 e1a00200 MOV r0,r0,LSL #4<br />000008 e1510220 CMP r1,r0,LSR #4<br />00000c 1a000001 BNE |L1.24|<br />;;;4 return 1;<br />000010 e3a00001 MOV r0,#1<br /> |L1.20|<br />000014 e1a0f00e MOV pc,lr<br />;;;5 else<br />;;;6 return 0;<br /> |L1.24|<br />000018 e3a00000 MOV r0,#0<br />00001c eafffffc B |L1.20|<br />;;;7 }<br /> ENDP<br /><br /> main PROC<br />;;;9 int main(void)<br />;;;10 {<br />000020 e59f0004 LDR r0,|L1.44|<br />;;;11 volatile int d;<br />;;;12 <br />;;;13 d = test(0xA5555550);<br />000024 eafffffe B test<br /> |L1.40|<br />000028 05555550 DCD 0x05555550<br /> |L1.44|<br />00002c a5555550 DCD 0xa5555550<br />;;;14 <br />;;;15 return d;<br />;;;16 }<br /> ENDP<br /><br /><br /><br /> END<br /><br />用UEDIT比较一下两个文件,生成的代码除一行不同外,其它的都一样(包括地址也一样),不同的一行是<br />000008 e1500221 CMP r0,r1,LSR #4 ;805版<br />000008 e1510220 CMP r1,r0,LSR #4 ;848版<br /><br />第二个测试程序:<br />文件名:test2.c<br />#include "stdio.h"<br /><br />int test(unsigned int d)<br />{<br /> if((d & 0x0fffffff) == 0x05555550)<br /> return 1;<br /> else<br /> return 0;<br />}<br /><br />int main(void)<br />{<br /> volatile int d, c;<br /> <br /> scanf("%d",&d);<br /> d = test(d);<br /> <br /> c = 2 * d;<br /> printf("
d=%d
c=%d
",d,c);<br /> <br /> return c;<br />}<br /><br />在805版编译器下编译,生成test1b805.s:<br />(armcc -O1 -S -fs -cpu ARM7TDMI -o test2b805.s test2.c)<br />; generated by ARM C Compiler, ADS1.2 [Build 805]<br /><br />; commandline [-O1 -S -fs "-IC:Program FilesARMADSv1_2INCLUDE"]<br /> CODE32<br /><br /> AREA ||.text||, CODE, READONLY<br /><br /> test PROC<br />;;;3 int test(unsigned int d)<br />;;;4 {<br />000000 e59f1054 LDR r1,|L1.92|<br />;;;5 if((d & 0x0fffffff) == 0x05555550)<br />000004 e1a00200 MOV r0,r0,LSL #4<br />000008 e1500221 CMP r0,r1,LSR #4<br />00000c 1a000001 BNE |L1.24|<br />;;;6 return 1;<br />000010 e3a00001 MOV r0,#1<br /> |L1.20|<br />000014 e1a0f00e MOV pc,lr<br />;;;7 else<br />;;;8 return 0;<br /> |L1.24|<br />000018 e3a00000 MOV r0,#0<br />00001c eafffffc B |L1.20|<br />;;;9 }<br /> ENDP<br /><br /> main PROC<br />;;;11 int main(void)<br />;;;12 {<br />000020 e92d401c STMFD sp!,{r2-r4,lr}<br />;;;13 volatile int d, c;<br />;;;14 <br />;;;15 scanf("%d",&d);<br />000024 e28d1004 ADD r1,sp,#4<br />000028 e28f0030 ADR r0,|L1.96|<br />00002c ebfffffe BL _scanf<br />;;;16 d = test(d);<br />000030 e59d0004 LDR r0,[sp,#4]<br />000034 ebfffffe BL test<br />000038 e58d0004 STR r0,[sp,#4]<br />;;;17 <br />;;;18 c = 2 * d;<br />00003c e59d0004 LDR r0,[sp,#4]<br />000040 e1a04080 MOV r4,r0,LSL #1<br />;;;19 printf("
d=%d
c=%d
",d,c);<br />000044 e1a02004 MOV r2,r4<br />000048 e59d1004 LDR r1,[sp,#4]<br />00004c e28f0010 ADR r0,|L1.100|<br />000050 ebfffffe BL _printf<br />;;;20 <br />;;;21 return c;<br />000054 e1a00004 MOV r0,r4<br />000058 e8bd801c LDMFD sp!,{r2-r4,pc}<br /> |L1.92|<br />00005c 05555550 DCD 0x05555550<br /> |L1.96|<br />000060 00006425 DCB "%d "<br /> |L1.100|<br />000064 253d640a DCB "
d=%"<br />000068 630a2064 DCB "d
c"<br />00006c 0a64253d DCB "=%d
"<br />000070 00000000 DCB " "<br />;;;22 } ENDP<br /><br /><br /><br /> END<br />在848版下编译生成test2b848.s<br />(armcc -O1 -S -fs -cpu ARM7TDMI -o test2b848.s test2.c)<br />; generated by ARM C Compiler, ADS1.2 [Build 848]<br /><br />; commandline [-O1 -S -fs "-IC:Program FilesARMADSv1_2INCLUDE"]<br /> CODE32<br /><br /> AREA ||.text||, CODE, READONLY<br /><br /> test PROC<br />;;;3 int test(unsigned int d)<br />;;;4 {<br />000000 e59f1054 LDR r1,|L1.92|<br />;;;5 if((d & 0x0fffffff) == 0x05555550)<br />000004 e1a00200 MOV r0,r0,LSL #4<br />000008 e1510220 CMP r1,r0,LSR #4<br />00000c 1a000001 BNE |L1.24|<br />;;;6 return 1;<br />000010 e3a00001 MOV r0,#1<br /> |L1.20|<br />000014 e1a0f00e MOV pc,lr<br />;;;7 else<br />;;;8 return 0;<br /> |L1.24|<br />000018 e3a00000 MOV r0,#0<br />00001c eafffffc B |L1.20|<br />;;;9 }<br /> ENDP<br /><br /> main PROC<br />;;;11 int main(void)<br />;;;12 {<br />000020 e92d401c STMFD sp!,{r2-r4,lr}<br />;;;13 volatile int d, c;<br />;;;14 <br />;;;15 scanf("%d",&d);<br />000024 e28d1004 ADD r1,sp,#4<br />000028 e28f0030 ADR r0,|L1.96|<br />00002c ebfffffe BL _scanf<br />;;;16 d = test(d);<br />000030 e59d0004 LDR r0,[sp,#4]<br />000034 ebfffffe BL test<br />000038 e58d0004 STR r0,[sp,#4]<br />;;;17 <br />;;;18 c = 2 * d;<br />00003c e59d0004 LDR r0,[sp,#4]<br />000040 e1a04080 MOV r4,r0,LSL #1<br />;;;19 printf("
d=%d
c=%d
",d,c);<br />000044 e1a02004 MOV r2,r4<br />000048 e59d1004 LDR r1,[sp,#4]<br />00004c e28f0010 ADR r0,|L1.100|<br />000050 ebfffffe BL _printf<br />;;;20 <br />;;;21 return c;<br />000054 e1a00004 MOV r0,r4<br />000058 e8bd801c LDMFD sp!,{r2-r4,pc}<br /> |L1.92|<br />00005c 05555550 DCD 0x05555550<br /> |L1.96|<br />000060 00006425 DCB "%d "<br /> |L1.100|<br />000064 253d640a DCB "
d=%"<br />000068 630a2064 DCB "d
c"<br />00006c 0a64253d DCB "=%d
"<br />000070 00000000 DCB " "<br />;;;22 } ENDP<br /><br /><br /><br /> END<br />用UEDIT比较一下两个文件,生成的代码除一行不同外,其它的都一样(包括地址也一样),不同的一行是<br />000008 e1500221 CMP r0,r1,LSR #4 ;805版<br />000008 e1510220 CMP r1,r0,LSR #4 ;848版<br /><br />折腾了好几天,原来是版本太老了。<br />不过还好,学了不少东西,也感谢各位的指导!<br /><br />还在使ADS1.2的要注意升级了!<br />补丁下载地址:<br />http://www.arm.com/support/downloads/info/4554.html<br /><br />看版本号的方法:<br />在命令提示符下输入<br />armcc<br />输出<br />ARM C Compiler, ADS1.2[Build 848]<br />...
|