现有如下代码:
int main(int argc char *argv[])
{
int a = 0 b c d[4096] e;
e = d[4095];
b = a;
c = a;
printf("a:%d b:%d c:%d e:%d\n" a b c e);
return 0;
}
用“arm-linux-gnueabihf-gcc-O2”优化编译,反汇编结果是:
int main(int argc char *argv[])
{
831c: b530 push {r4 r5 lr}
831e: f5ad 4d80 sub.w sp sp #16384 ; 0x4000
8322: b083 sub sp #12
8324: 2100 movs r1 #0
8326: f50d 4580 add.w r5 sp #16384 ; 0x4000
832a: f248 4018 movw r0 #33816 ; 0x8418
832e: 3504 adds r5 #4
8330: 460a mov r2 r1 -> b= a;
8332: 460b mov r3 r1 -> c= a;
8334: f2c0 0000 movt r0 #0
8338: 682c ldr r4 [r5 #0]
833a: 9400 str r4 [sp #0] -> e = d[4095];
833c: f7ff efd4 blx 82e8 <_init>
}
显然,尽管源代码级别b=a、c=a发生在e=d[4095]之后,但是目标代码的b=a、c=a指令发生在e=d[4095]之前。
有人知道是为什么吗?