c语言 乱序字符,C语言编译乱序问题

现有如下代码:

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]之前。

有人知道是为什么吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值