硬核!用这个工具看了i++和++i的汇编代码,小白也能明白它们的区别
大家好,我是阿汤哥。
++和++i的含义和区别:
它们的效果都是i自增。区别在于:i自增和计算整个表达式的值的先后顺序不一样。
前缀形式(++i):++在i的前面,所以i先自增,变成i+1,表达式的值式i+1。
后缀形式(i++):++在i的后面,所以i在赋值给表达式之后自增,表达式的值为i,之后i自增为i+1。
今天,我们来利用VC6.0的disassembly工具(一些其他的编程软件,比如CodeBlocks,也有这个功能),来看看 i++和 i--对应的汇编代码,你就更能明白它们的区别了。
先说个概念:
汇编语言:我们知道编程语言有很多种,有高级的编程语言(比如C、C++),也有更接近底层机器码的低级语言。
汇编语言就是这样的一种低级语言,它介于高级语言和机器语言(二进制代码)之间。
高级语言的代码,通常可以写的很简洁,但是它对应的汇编语言代码可能会有多个语句。
我们可以理解为,汇编是对高级语言代码的一个拆分和细化。
看汇编语言的代码,你更能明白底层的指令是怎么运行的。
举个例子:
int i =5;
这行C语言代码对应的汇编代码的形式为:
mov dword ptr [ebp-4], 5
其中mov是一个汇编指令,作用是数据传送,把一个数据传送到一个目标地址。
dword ptr [ebp-4] :这个是i的地址 (其中dword,全程是double word,双字。也就是四个字节;ebp)
5:就i是要传送的数据。
这行代码的含义就是把5传送到地址dword ptr [ebp-4]里。
再说一个汇编里的指令add,顾名思义,这是加法指令。
接下来,我们看看如何在vc6.0里查看C代码对应的汇编代码:
第一步,把鼠标放到代码任意一行,比如"int a =0"这行。然后点击图中手形图标,插入一个断点。
第二步,点击下面图中的图标。
第三步,菜单栏->View -> Debug Windows -> Disassembly
就能看到每行C代码对应的汇编代码了。截图如下:
第一列的0040D708这个不用管,这个是内存地址编号。
7: 8: ... 11:这几个是C代码在源文件中的行数。
我们着重来比较下int a = ++i和 int a = i++汇编代码的差异。
我们来看下每行的含义:(你大致知道个意思,不用深究汇编的代码)
初始化变量i和a:
[code]7: int i = 5; //把5传送到内存地址dword ptr [ebp-4](这是i的内存地址)中 mov dword ptr [ebp-4],5 9: int a = 0; //把0传送到内存地址dword ptr [ebp-8](这是a的内存地址)中 mov dword ptr [ebp-8],0
语句:a = ++1
[code]11: a = ++i; //(1)首先把i所在地址dword ptr [ebp-4]的内容(5)放进累加器eax mov eax,dword ptr [ebp-4] //(2)执行add执行,累加器eax中的数加上1(变为6) add eax,1 //(3)把加1后的累加器eax中的数(6),再传送给i的地址dword ptr [ebp-4] mov dword ptr [ebp-4],eax //(4)把i所在地址dword ptr [ebp-4]的数(6)传送给ecx寄存器 mov ecx,dword ptr [ebp-4] //(5)把ecx寄存器中的传送给a所在地址dword ptr [ebp-8] mov dword ptr [ebp-8],ecx
可以看出,它是i先自增,然后把自增后的i的值赋给a;
语句 a = i++
[code]13: a = i++; //(1)把i所在地址dword ptr [ebp-4]的内容(6)放进edx寄存器 mov edx,dword ptr [ebp-4] //(2)把edx寄存器中的数(6)传送给a所在地址dword ptr [ebp-8] mov dword ptr [ebp-8],edx //(3)把i所在地址dword ptr [ebp-4]的内容(6)放进累加器edx mov eax,dword ptr [ebp-4] //(4)执行add(加法)指令,累加器中的数加1,变为7 add eax,1 //(5)把累加器eax中的数(7)传送给i所在内存地址dword ptr [ebp-4] mov dword ptr [ebp-4],eax
可以看出,先把i的值赋给a,然后i再自增。
看了的汇编代码,相信大家更能明白++i和i++的区别了。
- 我这个小白又来了,最近在尝试运行网上的开源代码,服务器连接报错了好像,求帮助?
- 开发软件要自学编程吗?这个工具,0代码就能定制管理软件
- Python一行代码搞定炫酷可视化,就用这个工具!
- 代码管理工具 SVN和git的区别-----------------------------落雨成风
- Oracle 小白请教 请问为什么我这个代码只可以输出一行
- android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析
- i++与++i有何区别,看这段代码你就明白了
- Myeclipse for spring9.0破解方法试验过同样适用于10-超简单明白 (使用网上流传的自动破解工具无法破解的可以使用这个) 亲测可用
- FFmpegTool 这个是很早以前写得ffmpeg c99部分转C89工具代码
- 一直搞不懂迭代和递归有什么区别看了这个文章大概明白了
- wap获取手机号码,今天uc开启云加速,用公司的工具类获取是null,但是另外一个项目可以,应该这个项目的工具旧少了一些代码。。,网上找了 方法自己加可以
- 有没有一个工具可以帮助查找python的bug和进行静态的代码区别
- FFmpegTool 这个是很早以前写得ffmpeg c99部分转C89工具代码
- hopper反汇编工具的逆向伪代码功能并不理想
- FFmpegTool 这个是很早以前写得ffmpeg c99部分转C89工具代码
- 从数据平台到报表开发,我靠这个零代码报表工具,转行后月薪3W
- SSL证书与key/CSR匹配工具这个代码如何写呢?
- AStyle代码格式工具在source insight中的使用 --写给小白
- 【汇编】奇校验程序:输入一个字符,编写一个程序判断这个字符中1的个数,如果是偶数个1,则校验位(字符最高位)为1,如果是奇数个1,则校验位为0。并显示加入校验位前后该字符的二进制代码。
- 不会编程,又想开发软件怎么办呢?其实用这个工具,0代码也能定制管理软件