|
发表于 2010-8-27 01:33:47
|
显示全部楼层
回复【63楼】aozima
确认和编译器有关:
现象: mp3解码程序 imdct.c的 static __inline void imdct12 (int *x, int *out) 函数
参数传入使用 x:r0 out:r1
{
......................
*out = x0 + x1; out++;
*out = x2 + x3; out++;
*out = x4 + x5; out++;
*out = x4 - x5; out++;
*out = x2 - x3; out++;
*out = x0 - x1;
}
但编译器没有保存r0与r1的备份就直接使用了r0和r1.
于是,out就飞了.
上传使用o0编译和o3编译的汇编代码,可以看到. o0的:
0x08016898 e92d4ffe push {r1-r11,lr}
0x0801689c 4604 mo......
-----------------------------------------------------------------------
写了一段简单的代码测试了一下,证实了只要在局部变量把寄存器消耗完了以后就会出这个bug,还是挺严重的,arm官方的update里面还没有出补丁。
同样一段代码,原先编译成这样
0x08019814 E92D4FF3 PUSH {r0-r1,r4-r11,lr}
0x08019818 B086 SUB sp,sp,#0x18
现在变成了这样
0x08019688 E92D4FF0 PUSH {r4-r11,lr}
0x0801968C B087 SUB sp,sp,#0x1C
少压了两个word,可惜后面弹栈没有变 -,-| 于是刚好就把上一级的lr给弹出来了。 |
|