• ++a可以赋值而a++不可以赋值
  • 寄存器eax
 int a = 5;
00064EB8  mov         dword ptr [a],5  // a++ = 6;++a = 6;
00064EBF  mov         eax,dword ptr [a]   // 先把a的值赋给eax
00064EC2  add         eax,1               // eax的值为6
00064EC5  mov         dword ptr [a],eax   // 把eax中的6赋给a
00064EC8  mov         dword ptr [a],6     // 再把6赋给aprintf("a is %d \n", a);
00064ECF  mov         eax,dword ptr [a]
  • 进一步分析,++a可以赋值是因为值被覆盖了
 int a = 5;
00C64EB8  mov         dword ptr [a],5  // a++ = 6;++a = 7;
00C64EBF  mov         eax,dword ptr [a]
00C64EC2  add         eax,1
00C64EC5  mov         dword ptr [a],eax
00C64EC8  mov         dword ptr [a],7
  • 乍一看a++和++a并没有区别
 int a = 5;
007E4EB8  mov         dword ptr [a],5  ++a = 7;
007E4EBF  mov         eax,dword ptr [a]
007E4EC2  add         eax,1
007E4EC5  mov         dword ptr [a],eax
007E4EC8  mov         dword ptr [a],7  a++;
007E4ECF  mov         eax,dword ptr [a]
007E4ED2  add         eax,1
007E4ED5  mov         dword ptr [a],eax
  • 利用一个变量观察
  • ++a + 1 先加1再进行运算
 int a = 5;
00D7176E  mov         dword ptr [a],5  int b = ++a + 1;
00D71775  mov         eax,dword ptr [a]
00D71778  add         eax,1
00D7177B  mov         dword ptr [a],eax
00D7177E  mov         ecx,dword ptr [a]
00D71781  add         ecx,1
00D71784  mov         dword ptr [b],ecx  int c = a++ + 1;
00D71787  mov         eax,dword ptr [a]
00D7178A  add         eax,1
00D7178D  mov         dword ptr [c],eax
00D71790  mov         ecx,dword ptr [a]
00D71793  add         ecx,1
00D71796  mov         dword ptr [a],ecx
  • 分析 a++ 和 +1可能看不出问题,改为 +2
 int a = 5;mov         dword ptr [a],5  int b = ++a + 2;// a自加1mov         eax,dword ptr [a]   // eax = a = 5add         eax,1   // eax = eax + 1 = 6mov         dword ptr [a],eax  // a = eax = 6// 将a的值6赋给ecxmov         ecx,dword ptr [a]   // ecx = a = 6add         ecx,2   // ecx = 8mov         dword ptr [b],ecx   // b = ecx = 8
// a = 6int c = a++ + 2;mov         eax,dword ptr [a]   // eax = a = 6add         eax,2   // eax = 8mov         dword ptr [c],eax  // c = eax = 8mov         ecx,dword ptr [a]  add         ecx,1  mov         dword ptr [a],ecx  // a = ecx = 7
  • 结果
  • ++a先把值给寄存器,再返回 a 本身
  • a++会产生歧义

汇编观察a++和++a相关推荐

  1. x86 汇编的基础知识

    x86 汇编器编程 基于x86 实现编译器首先得了解x86 平台的指令调度, 以下是一些我在实现编译器过程中用到的基础知识! 大部分内容参考了 青木的自制编译器, 基于GNU汇编器 c语言使用gcc ...

  2. (转载)关于IAP与APP互相跳转的实现

    最近一个项目用到了IAP功能,在21IC看到的这个文章很有帮助,分享一下 关于IAP与APP互相跳转的实现 首先,在您动手做这个实验之前,先要弄清除咱俩的软硬件有什么不同: 1. 我的CPU是STM3 ...

  3. linux 内核 报错,根据epc定位linux内核报错.pdf

    根据epc定位linux内核报错.pdf 韩⼤卫@吉林师范⼤学 2014.12.10 转载请表明出处 ************************************************* ...

  4. C++:类的构造函数与析构函数

    目录 一.前言 二.类的构造函数 1.构造函数基本概念与语法细则 2.编译器默认生成的无参构造函数和自定义构造函数 3.构造函数的特性(可重载) 4.关于构造函数的注意事项 5.构造函数的应用示例: ...

  5. 从汇编代码的角度观察switch与if...else,乘除与移位的差别

    Switch与if-else 有以下两个函数,y值根据x值进行加法运算,功能相同,SumSwitch()是switch版本,SumIfElse()是if else版本: public int SumS ...

  6. (动图详解)汇编视角观察函数栈帧的创建和销毁

    目录 ​1.阅读本文的价值 ​2.函数栈帧及栈的概念 ​3.部分寄存器及汇编指令 ​4.main函数的调用 5.main函数的栈帧创建 ​6.变量的栈帧创建 ​6.函数传参 ​7.函数内部运算及销毁 ...

  7. 【汇编综合应用】大小写字母的转换、2号、9号和10号DOS系统功能调用、分支、循环程序结构、子程序、寄存器传递参数,宏定义、宏调用,观察宏展开。

    实验内容 编程实现:用10号DOS功能调用从键盘输入一串大小写字母到BUF为首址的缓冲区中,然后将其中的小写字母换成大写字母,原大写字母不变,仍然放入本缓冲区,再将该字符串内容在显示器上显示,且以十六 ...

  8. SIGSEGV 和 SIGBUS gdb看汇编

    参考这篇文章: http://blog.chinaunix.net/uid-24599332-id-2122898.html SIGBUS和SIGSEGV也许是我们在平时遇到的次数最多的两个内存错误信 ...

  9. led伏安特性实验误差分析_检测实验室误差分析知识汇编

    2019-12-20 09:56:10 来源: 检测实验室误差分析知识汇编-检测家 第一部分 误差理论简介 在日常检测工作中,我们虽然有最好的检验方法.有检定合格的仪器设备.有满足检验要求的环境条件和 ...

最新文章

  1. 制度汇编格式怎么生成目录_来自世界500强企业的管理表格DOC格式 1900套
  2. python读取mtcars数据集并实现以下操作_Python可视化43 | plotnine≈R语言ggplot2,43plotnineR...
  3. html页面js遍历listview,javascript实现的listview效果
  4. 异步爬虫-aiohttp库、Twisted库简介
  5. 真香!全场景AI计算开源框架MindSpore,我爱了
  6. 自考计算机毕业论文答辩视频,过来人谈自考毕业论文答辩有感
  7. VB6(Fast Report Studio 4.6.80)
  8. SuperMap加载三维模型数据(osgb格式)——以SuperMap iDesktopX 10i为例
  9. Flask: 跨域上传的回调方案
  10. Python 实现控制一阶惯性系统
  11. 政务大数据的上下文范围
  12. exe文件修复,关于logo1_exe“威金”变种病毒的探讨
  13. VT100 终端控制码
  14. 从贫穷到富有——我的修行之路
  15. 学习java数组的练习代码
  16. 营养学和计算机交叉,营养配餐系统综述
  17. Linux signal、sigaction的使用总结
  18. 江苏海信ip906h盒子,强刷固件及教程(70T1版本)
  19. LibreOffice SDK 开发环境配置(Windows)
  20. Educoder计算机数据表示实验(HUST)-汉字国标码转区位码实验偶校验编码设计logisim

热门文章

  1. 计算机软著研究生毕业,关于研究生推免工作科研成果和竞赛计分详细说明
  2. Vue-自定义表单验证
  3. 【数论】蓝桥2018:第几个幸运数
  4. FFmpeg源代码简单分析:libavdevice的gdigrab
  5. java证书验证失败_Java 跳过 HTTPS 请求过程中证书验证问题
  6. 光模块价格由带宽还是距离决定_5G光模块市场:行“提量降本”之道 走“技术深耕”之途...
  7. java graphics旋转_Java图像之自定义角度旋转(实例)
  8. 2021 ZUST,XCPC选拔赛
  9. 【PAT】2020年秋季考试划水准备贴
  10. 用iTunes管理iPhone