本帖最后由 xfiori 于 2014-5-5 15:08 编辑
近日开发一个项目,调试的时候好好的,发布的软件确死活不正常,后来一步步看,终于发现是编译器优化造成的,不过为何会优化成这种结果,却百思不得其解啊,望高手指点。
wTemp = MAKEWORD(a,b);
\ 000000B6 ........ LDR.W R0,??DataTable39_9
\ 000000BA 617B LDRB R1,[R4, #+13]
\ 000000BC 227B LDRB R2,[R4, #+12]
\ 000000BE 02EB0121 ADD R1,R2,R1, LSL #+8
wTemp = (wTemp>>4) & 0x1FF;
\ 000000C2 CA05 LSLS R2,R1,#+23
\ 000000C4 D20E LSRS R2,R2,#+27
c = (uint8_t)(wTemp*50/0x150);
\ 000000C6 3221 MOVS R1,#+50
\ 000000C8 5143 MULS R1,R1,R2
\ 000000CA 4FF4A872 MOV R2,#+336
\ 000000CE 91FBF2F1 SDIV R1,R1,R2
其中最关键的问题出在第二步,我明明需要先右移4位,然后与0x1FF,这样可以得到高位的内容
而优化后的代码,给我先左移23位,再右移27位,虽然也达到了右移4位的目的,可是我的高位却丢失了,造成结果总是不正确
它实际上已经变成了 wTemp = (wTemp&0x1FF) >> 4;
而我明明是有括号的,甚至于我就算这样写
wTemp = (wTemp&0x1FFF) >> 4;
或者这样写
wTemp = wTemp >> 4;
wTemp &= 0x1FFF;
最后的优化结果也是一样的。。。。。
不知道哪位高人对此有所了解,可以解答我的疑惑呢?
|