c语言自增运算的汇编探究

本文探讨了C语言中自增运算符在GCC编译器下的编译过程,通过反汇编分析了函数参数计算顺序及临时变量的存储位置。实验结果显示,临时值不仅可能存储在寄存器中,当数量过多时也会使用栈,从而保证正确输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出于对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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值