出于对c语言编译链接过程的疑问,近段时间一直在看关于编译链接以及可执行文件加载方面的书.今晚忽然心血来潮,想看看对于自增运算gcc究竟如何编译,所以写了下面这段小程序验证一下(部分代码 环境 ubuntu15.04 gcc )
18
19 int i=0;
20 printf("%d\n",++i);
21 i=0;
22 printf("%d\n",i++);
23 i=0;
24 printf("%d\n%d\n",i++,++i);
25 i=0;
26 printf("%d\n%d\n",++i,i++);
之后执行 本来在我意想之中输出结果应该是1 0 1 1 0 2 1
但是实际运行结果
运行结果:
1
0
1
2
2
0
于是祭出了反汇编这大杀器;
以下是反汇编可执行文件的结果:
int i=0;
804842c: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
printf("%d\n",++i);
8048433: 83 45 f4 01 addl $0x1,-0xc(%ebp)
8048437: 83 ec 08 sub $0x8,%esp
804843a: ff 75 f4 pushl -0xc(%ebp)
804843d: 68 50 85 04 08 push $0x8048550
8048442: e8 a9 fe ff ff call 80482f0 <printf@plt>
8048447: 83 c4 10 add $0x10,%esp
i=0;
804844a: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
printf("%d\n",i++);
8048451: 8b 45 f4 mov -0xc(%ebp),%eax
8048454: 8d 50 01 lea 0x1(%eax),%edx
8048457: 89 55 f4 mov %edx,-0xc(%ebp)
804845a: 83 ec 08 sub $0x8,%esp
804845d: 50 push %eax
804845e: 68 50 85 04 08 push $0x8048550
8048463: e8 88 fe ff ff call 80482f0 <printf@plt>
8048468: 83 c4 10 add $0x10,%esp
i=0;
804846b: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
printf("%d\n%d\n",i++,++i);
8048472: 83 45 f4 01 addl $0x1,-0xc(%ebp)
8048476: 8b 45 f4 mov -0xc(%ebp),%eax
8048479: 8d 50 01 lea 0x1(%eax),%edx
804847c: 89 55 f4 mov %edx,-0xc(%ebp)
804847f: 83 ec 04 sub $0