【汇编 C】i++和++i底层刨析

17 篇文章 1 订阅

前言:本文章仅是使用汇编对i++和++i的底层进行分析,不做深入。

先看第一个案例:

#include <stdio.h>            // 头文件
#include <Windows.h>

int main()
{
	__asm mov eax,eax;        // 设置断点
	int ii = 0;               // 局部变量
	ii++;
	printf("%d",ii);
	++ii;
	printf("%d",ii);
	return 0;
}

        代码的逻辑很简单,简单到没有逻辑。就不解释了。

        CTRL+ALT+F7编译,F5运行,ALT+8转到反汇编

        我们先来看从ii++到printf:

        再来看++ii到printf: 

        从上面两张图的ii++和++ii他们的动作来看,是没有任何区别的。这是为什么呢?因为我们没有立即使用到这个值,就是说ii++和++ii我们只是当作一个加值的操作直接过了,并没有把它当成表达式去立即使用,所以底层也就是这两个步骤作为了"变量+1"的操作,所以是一样的。

        我们稍微修改一下代码,如下: 

#include <stdio.h>            // 头文件
#include <Windows.h>

int main()
{
	__asm mov eax,eax;        // 设置断点
	int ii = 0;               // 局部变量
	printf("%d",ii++);

	printf("%d",++ii);
	return 0;
}

        CTRL+ALT+F7编译,F5运行,ALT+8转到反汇编

        我们再来看看ii++:

        我们可以看到,ii++的操作是:先将值 0 取出,放到一个临时的局部变量ebp-D0中,然后再将+1的结果放到ecx中,ecx最终又放回了ii这个局部变量,然后调用函数的时候传给printf的是临时局部变量的0,其实变量已经+1了,只不过传给printf的是未+1之前备份的值。

        所以总结:ii++的动作是,先+1后输出。

        再来看看++ii:

        我们可以看到:++ii的动作也是先加1后输出 。

总结:

        无论是ii++还是++ii,其实在底层汇编上,都是先+1,然后再输出不过++ii输出的是+1之后的变量,而ii++输出的则是+1之前备份的临时变量。所以才会看到,第一个输出的是0、第二个输出的是2。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值