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

时间: 2024-10-09 10:12:55

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

20145311利用gdb调试汇编代码

利用GDB调试汇编代码 首先编写c语言原代码,我使用的是同学分析过的代码 #include<stdio.h>short addend1 = 1;static int addend2 = 2;const static long addend3 = 3; static int g(int x){    return x + addend1;} static const int f(int x){    return g(x + addend2);} int main(void){    retur

从linux0.11中起动部分代码看汇编调用c语言函数

上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一段代码(linux0.11的启动分析部分会在另一部分中再分析,由于此文仅涉及c与汇编代码的问题,). after_page_tables: pushl $0 # These are the parameters to main :-) pushl $0 pushl $0 pushl $L6 # re

86/88汇编代码的执行调试

86/88汇编是windows系统的语言基础之中的一个.本文就是在32位window操作系统下通过dos系统执行86/88汇编代码.2005年我在武汉科技大学读本科时,为了计算机三级pc上机试题的怎样执行而发愁.我从微机原理上机实践课的一个样例中提取出执行86/88汇编代码打印显示的代码片段,并把三级pc上机试题通过简单改动(试题尾部加入显示结果代码)所有转变成可以执行并输出运算结果的代码.操作步骤例如以下,希望给各位学弟学妹们有所帮助,顺利考过三级pc上机,增强大家的动手能力和让大家可以看到自

86/88汇编代码的运行调试

86/88汇编是windows系统的语言基础之一,本文就是在32位window操作系统下通过dos系统运行86/88汇编代码.我在上大学是为了计算机三级pc上机试题的运行发愁,我终于从微机原理上机实践课的一个例子中提取出运行86/88汇编代码的代码片段,并通过简单修改把三级pc上机试题的尾部全部转变成可以运行的代码.操作过程如下,希望给各位学弟学妹们有所帮助,顺利考过三级pc上机,增强大家的动手能力和让大家能够看到自己写的代码的运行结果. 版权声明:本文为博主原创文章,未经博主允许不得转载.

C/C++学习 - gcc编译过程查看汇编代码

GCC GCC参数 举例 GCC gcc大家都很熟悉,是个编译器,功能强大,全称是:GUN GCC. 平时大家都简单的称为:GCC, 功能强大,能够编译很多的语言.包括:c, c++, java, ada等- GCC参数 gcc平时有很多参数,在平时我编译小程序的时候,都直接gcc -o object source.c就可以了. 但是有一次我想查看我同样目的但是不同写法的两个代码是执行效率上是否有差别.所以我就查了下gcc编译过程中的汇编代码的参数. 参数 说明 -c 只编译不链接,生成*.o文

32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各种声明 那么现在有大神,已经帮我们做了一个IDE环境,就是RadAsm,首先简单介绍一下界面 (对于这个IDE(最新版是3.0)我已经打包好了,有中文版本,和英文版本) 我们需要配置一下环境 1.配置编译环境,配置lib文件库,配置Debug调试器 打开后会弹出 首先这里我们注意下面的几个选项 1.

如何在Code::Blocks下查看程序的汇编代码

学习C语言,Code::Blocks是个不错的IDE.有时候我们需要查看程序的对应的汇编代码,那么Code::Blocks如何才能像vc6.0中那样debug时候查看反汇编代码呢? 首先创建一个工程:Create a new project -> ConsoleApplication -> 填上工程文件名和project路径 -> 调试器和编译器默认. 随便在工程里写点什么代码,比如下面的一个递归代码为例:k7娱乐城 #include "stdio.h" #inclu

VS2013显示行号及显示程序汇编代码

自己重新拾起来记录,,,,新手看,,,VS2013与以往版本基本相同. 1.显示行号 Microsoft Visual Studio 2013 默认情况下也是不显示代码的行号的,这样对于我们阅读代码和调试也是很不方便的. 基于上面的问题,我们可以做这样的设置:点击菜单栏的"TOOLS(工具)"-->"Options(选项)",弹出选项窗体-->选择左方的"TextEditor(文本编辑器)"-->选择"All Lang

汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写

汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写 一丶内存寻址模型 逻辑地址.线程地址.物理地址 了解汇编之前.先了解一下上面这些词的含义; 逻辑地址: 这个是邮编一起生成的.逻辑地址一般都是 段加段内偏移组成的.每个进程独享. 线性地址: 由分段管理机制.将逻辑地址转化为线性地址.这个了解即可.学过内核的人看到应该明白.如果没有学过.简单滤过即可(32位下逻辑 = 线性) 物理地址: 通过分页管理机制(内核中成为PDE PTE等页目录 页表等等)将线性地址转化为物理地址. 这些了