汇编观察a++和++a
- ++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相关推荐
- x86 汇编的基础知识
x86 汇编器编程 基于x86 实现编译器首先得了解x86 平台的指令调度, 以下是一些我在实现编译器过程中用到的基础知识! 大部分内容参考了 青木的自制编译器, 基于GNU汇编器 c语言使用gcc ...
- (转载)关于IAP与APP互相跳转的实现
最近一个项目用到了IAP功能,在21IC看到的这个文章很有帮助,分享一下 关于IAP与APP互相跳转的实现 首先,在您动手做这个实验之前,先要弄清除咱俩的软硬件有什么不同: 1. 我的CPU是STM3 ...
- linux 内核 报错,根据epc定位linux内核报错.pdf
根据epc定位linux内核报错.pdf 韩⼤卫@吉林师范⼤学 2014.12.10 转载请表明出处 ************************************************* ...
- C++:类的构造函数与析构函数
目录 一.前言 二.类的构造函数 1.构造函数基本概念与语法细则 2.编译器默认生成的无参构造函数和自定义构造函数 3.构造函数的特性(可重载) 4.关于构造函数的注意事项 5.构造函数的应用示例: ...
- 从汇编代码的角度观察switch与if...else,乘除与移位的差别
Switch与if-else 有以下两个函数,y值根据x值进行加法运算,功能相同,SumSwitch()是switch版本,SumIfElse()是if else版本: public int SumS ...
- (动图详解)汇编视角观察函数栈帧的创建和销毁
目录 1.阅读本文的价值 2.函数栈帧及栈的概念 3.部分寄存器及汇编指令 4.main函数的调用 5.main函数的栈帧创建 6.变量的栈帧创建 6.函数传参 7.函数内部运算及销毁 ...
- 【汇编综合应用】大小写字母的转换、2号、9号和10号DOS系统功能调用、分支、循环程序结构、子程序、寄存器传递参数,宏定义、宏调用,观察宏展开。
实验内容 编程实现:用10号DOS功能调用从键盘输入一串大小写字母到BUF为首址的缓冲区中,然后将其中的小写字母换成大写字母,原大写字母不变,仍然放入本缓冲区,再将该字符串内容在显示器上显示,且以十六 ...
- SIGSEGV 和 SIGBUS gdb看汇编
参考这篇文章: http://blog.chinaunix.net/uid-24599332-id-2122898.html SIGBUS和SIGSEGV也许是我们在平时遇到的次数最多的两个内存错误信 ...
- led伏安特性实验误差分析_检测实验室误差分析知识汇编
2019-12-20 09:56:10 来源: 检测实验室误差分析知识汇编-检测家 第一部分 误差理论简介 在日常检测工作中,我们虽然有最好的检验方法.有检定合格的仪器设备.有满足检验要求的环境条件和 ...
最新文章
- 制度汇编格式怎么生成目录_来自世界500强企业的管理表格DOC格式 1900套
- python读取mtcars数据集并实现以下操作_Python可视化43 | plotnine≈R语言ggplot2,43plotnineR...
- html页面js遍历listview,javascript实现的listview效果
- 异步爬虫-aiohttp库、Twisted库简介
- 真香!全场景AI计算开源框架MindSpore,我爱了
- 自考计算机毕业论文答辩视频,过来人谈自考毕业论文答辩有感
- VB6(Fast Report Studio 4.6.80)
- SuperMap加载三维模型数据(osgb格式)——以SuperMap iDesktopX 10i为例
- Flask: 跨域上传的回调方案
- Python 实现控制一阶惯性系统
- 政务大数据的上下文范围
- exe文件修复,关于logo1_exe“威金”变种病毒的探讨
- VT100 终端控制码
- 从贫穷到富有——我的修行之路
- 学习java数组的练习代码
- 营养学和计算机交叉,营养配餐系统综述
- Linux signal、sigaction的使用总结
- 江苏海信ip906h盒子,强刷固件及教程(70T1版本)
- LibreOffice SDK 开发环境配置(Windows)
- Educoder计算机数据表示实验(HUST)-汉字国标码转区位码实验偶校验编码设计logisim
热门文章
- 计算机软著研究生毕业,关于研究生推免工作科研成果和竞赛计分详细说明
- Vue-自定义表单验证
- 【数论】蓝桥2018:第几个幸运数
- FFmpeg源代码简单分析:libavdevice的gdigrab
- java证书验证失败_Java 跳过 HTTPS 请求过程中证书验证问题
- 光模块价格由带宽还是距离决定_5G光模块市场:行“提量降本”之道 走“技术深耕”之途...
- java graphics旋转_Java图像之自定义角度旋转(实例)
- 2021 ZUST,XCPC选拔赛
- 【PAT】2020年秋季考试划水准备贴
- 用iTunes管理iPhone