C语言高级编程:汇编分析i++和++i

测试环境: Ubuntu 14.04

 

1. 代码

#include <stdio.h>


int main()
{
    int a;
    int b;
    int c;

    a = 1;
    b = a++;
    c = ++a;

    printf("b = %d, c = %d, a = %d\n", b, c, a);
}

 

2. 执行

baoli@ubuntu:~/c$ ./a.out

b = 1, c = 3, a = 3

 

 

3. 反汇编

objdump -S a.out

注:编译时加上-g

int main()
{
  40052d:    55                       push   %rbp
  40052e:    48 89 e5                 mov    %rsp,%rbp
  400531:    48 83 ec 10              sub    $0x10,%rsp
    int a;
    int b;
    int c;

    a = 1;
  400535:    c7 45 f4 01 00 00 00     movl   $0x1,-0xc(%rbp)

    b = a++;
  40053c:    8b 45 f4                 mov    -0xc(%rbp),%eax
  40053f:    8d 50 01                 lea    0x1(%rax),%edx
  400542:    89 55 f4                 mov    %edx,-0xc(%rbp)
  400545:    89 45 f8                 mov    %eax,-0x8(%rbp)

    c = ++a;
  400548:    83 45 f4 01              addl   $0x1,-0xc(%rbp)
  40054c:    8b 45 f4                 mov    -0xc(%rbp),%eax
  40054f:    89 45 fc                 mov    %eax,-0x4(%rbp)

    printf("b = %d, c = %d, a = %d\n", b, c, a);
  400552:    8b 4d f4                 mov    -0xc(%rbp),%ecx
  400555:    8b 55 fc                 mov    -0x4(%rbp),%edx
  400558:    8b 45 f8                 mov    -0x8(%rbp),%eax
  40055b:    89 c6                    mov    %eax,%esi
  40055d:    bf f4 05 40 00           mov    $0x4005f4,%edi
  400562:    b8 00 00 00 00           mov    $0x0,%eax
  400567:    e8 a4 fe ff ff           callq  400410 <printf@plt>
}

 

4. 分析

1)b = a++

  • 先将a的值保存到eax

  • 再将rax(即eax)的值加1保存到edx

  • 将edx写回内存a,即赋值给a

  • 将eax写到内存b,及赋值给b

2)c = ++a

  • 先将a的值加1

  • 再将a的值保存到eax

  • 将eax赋值给c

3)i++和++i最终都会使i的值加1

 

 

注:

|63..32|31..16|15-8|7-0|

               |AH.|AL.|

               |AX.....|

       |EAX............|

|RAX...................|

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello_courage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值