C++ | 调试 ·?从汇编代码看i++和++i的区别

Posted Jieson Wu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ | 调试 ·?从汇编代码看i++和++i的区别相关的知识,希望对你有一定的参考价值。

以int类型为例
C++编译器为++i生成的代码是
013E1375  mov        eax,dword ptr [i] 
013E1378  add         eax,1 
013E137B  mov        dword ptr [i],eax
很简单,基本不用分析
第一行是把i的值放到eax中,然后调用add对eax进行+1,最后将eax再放到i中
再看看i++
0119137E  mov        eax,dword ptr [i] 
01191381  add         eax,1 
01191384  mov        dword ptr [i],eax 
结果是完全一样,
 
下面再看看有赋值的情况
int c = ++i;
012D1384  mov        eax,dword ptr [i] 
012D1387  add         eax,1 
012D138A  mov        dword ptr [i],eax 
012D138D  mov        ecx,dword ptr [i] 
012D1390  mov        dword ptr [c],ecx 
可以看到这个操作在完成了前三部之后做了两个mov把最终的i值放到了c中
 
再看看
int b = i++;
012D1375  mov        eax,dword ptr [i] 
012D1378  mov        dword ptr [b],eax 
012D137B  mov        ecx,dword ptr [i] 
012D137E  add        ecx,1 
012D1381  mov        dword ptr [i],ecx 
结果稍有不同,在把i的值mov到eax之后又立即把eax放到了b中,随后的三步保持与之前一致只不过寄存器换成了ecx,正好符合i++的特性

未来CTO关注我CTO之路从此开始微信号:wlaicto

 

以上是关于C++ | 调试 ·?从汇编代码看i++和++i的区别的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记从汇编看 a+++a与 a+a++的区别

从汇编看C++程序的条件判断语句

调试一段for循环的C++语言程序,分析编译产生的汇编代码

从汇编看c++函数的默认参数

在lldb调试中调用c++函数 - 如何使用QuartzCore里面的日志消息

从 .NET 应用程序调试 C++ 代码时出现问题