|
楼主 |
发表于 2010-9-9 19:03:58
|
显示全部楼层
syw501说的太对了,后来才发现问题是前面代码的问题,但似乎又是无解的问题。c代码是这样的:(以下都是简写)
两个数据结构
typedef struct
{
short mm1;
short mm2;
short mm3;
short mm4;
}struct2;
typedef struct
{
----
----
struct2 m1;
struct2 m2;
----
----
}struct1;
struct1 g_test;
在代码中要对m1和m2清零:
if(0 == &(g_test.m1))
{
assert;
}
else
{
memset(&(g_test.m1), 0, 8);
}
if(0 == &(g_test.m2))
{
assert;
}
else
{
memset(&(g_test.m2), 0, 8);
}
于是出问题了,因为arm的汇编是这样的:
beq assert //if(0 == &(g_test.m1))
mov r1,0
mov r2,0
stmia r0!,{r1,r2} //为g_test.m1清零
beq assert //if(0 == &(g_test.m2))
stmia r0!,{r1,r2} //为g_test.m2清零
倒数第二句的beq assert导致了最终的assert。
问题在于mov r2,0之后Z标志位就被置了。这以前已经检查没有问题了。
如果不加zo选项,前面的汇编就不会是这样,取g_test.m2的地址的时候不会利用m1进行清零后自动加8的地址,所以就不会有问题。
现在的问题就是
1.mov r2,0在thumb指令下更改了标志位,既然这样,编译器就不应该在后面直接判断标志位。这只能说编译器优化的问题。
2.目前汇编就是这样的情况下,怎么解决这个问题? |
|