c++(vs上)与g++(linux下)对于++操作的汇编代码解读
先来看一个代码,估计很多同学都碰到过其中的某一个。
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- int a = ;
- printf("a++ = %d\n", a++);
- a = ;
- printf("++a = %d\n", ++a);
- a = ;
- printf("a += a++ =%d\n", a += a++);
- a = ;
- printf("a += (a++) =%d\n", a = a + (a++));
- a = ;
- printf("a += ++a =%d\n", a += ++a);
- a = ;
- printf("a += (++a) =%d\n", a += (++a));
- a = ;
- printf("++a += a++ =%d\n", ++a += a++);
- a = ;
- printf("(++a) += (a++) =%d\n", (++a) += (a++));
- return ;
- }
估计很多同学都饱受摧残(T-T)。
更坑的是,卧槽不同编译器下会有不用的结果。(╯°口°)╯(┴—┴
a.VS2013下的运行结果
b.g++下的运行结果
从结果可以看出,除了最开始两个书本上教的a++与++a是一致的(a++是先取a值然后再执行a=a+1,++a是先a = a+1,在取a的值)外,其他很多都不相同。
- (゚Д゚≡゚д゚)!? 这也能玩?
- 百思不得其姐,打开汇编代码一探究竟。
先来看下vs下的汇编(拍下脑子想下大一学的汇编):
- /* vs2013 */
- : printf("a += a++ =%d\n", a += a++);
- 011ECAC7 mov eax,dword ptr [a] //把a的值放入eax寄存器中
- 011ECACA add eax,dword ptr [a] //把a的值加到eax中(eax = eax+a )
- 011ECACD mov dword ptr [a],eax //把eax的值放入a, 以上就是 += 的操作
- 011ECAD0 mov ecx,dword ptr [a] //把a放入ecx寄存器中
- 011ECAD3 mov dword ptr [ebp-0D0h],ecx //直接打印了。。。--! 也就是忽略了a++ 直接打印了
- 011ECAD9 mov edx,dword ptr [a] //接下来就是执行a++,以及以下基础操作了。
- 011ECADC add edx,
- 011ECADF mov dword ptr [a],edx
- 011ECAE2 mov esi,esp
- 011ECAE4 mov eax,dword ptr [ebp-0D0h]
- 011ECAEA push eax
- 011ECAEB push 11F832Ch
- 011ECAF0 call dword ptr ds:[11FC1E4h]
- 011ECAF6 add esp,
- 011ECAF9 cmp esi,esp
- 011ECAFB call __RTC_CheckEsp (011E1631h)
- 简单的分析了,发现vs中a++的操作放在最后面执行。
再来瞧瞧g++的汇编代码:
g++下汇编和vs下汇编有很大不同,最大的一个是
vs: mov a,b 指将b->a
g++: mov a,b 指将a->b
(我改了下顺序,你就不能说我抄袭了吧c++(vs上)与g++(linux下)对于++操作的汇编代码解读的更多相关文章
SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...
Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比較的复杂,就直接跳过了,好在代码能用,记录一下- 两个实用的函数- //////////////// ...
大家好,我是良许. 在我们编写代码的时候,我们经常需要知道两个文件之间,或者同一个文件不同版本之间有什么差异性.在 Windows 下有个很强大的工具叫作 BeyondCompare ,那在 Linu ...
SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html 分享到:8 发布时 ...
[原文首次发表于51cto http://cloudapps.blog.51cto.com/3136598/1653672] 在Azure上创建了虚拟机之后,我们在一些情况下会需要添加更多的数据磁盘来 ...
catalog . 引言 . Linux平台上涉及的File IO操作 . Windows平台上涉及的File IO操作 0. 引言 本文试图讨论在windows.linux操作系统上基于C库进行文件 ...
我们要深刻理解学习NG的原理与安装方法,要切合实际结合业务需求,应用场景进行灵活使用. 一.Nginx知识简述Nginx是一个高性能的HTTP服务器和反向代理服务器,也是一个 IMAP/POP3/SM ...
本文转自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/18/2216279.html 1.linux下启动mysql的命令:my ...
最近在学习mysql,还是只菜鸟,找到下面篇文章对初学者挺有用的,所以共享下 1.linux下启动mysql的命令: mysqladmin start /ect/init.d/mysql star ...
随机推荐
3013: 皇后问题(递归) 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行 ...
mysql时间戳转日期格式SELECT FROM_UNIXTIME(add_time,'%Y-%m-%d %H:%i:%s') FROM `wh5_username` where id=23; 按in ...
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) ...
2016年10月29日 星期六 --出埃及记 Exodus 19:14 After Moses had gone down the mountain to the people, he consecr ...
strtr — 转换指定字符 string strtr ( string $str , string $from , string $to ) string strtr ( string $str , ...
Eclipse搭建Android5.0应用开发环境 "ndk-build":launchingfailed问题解决 详细参考http://blog.csdn.net/loongem ...
Spine效率低 Unity项目加载spine动画,经常会出现卡顿的情况,如游戏中瞬间播放一个动画,打开一个带spine动画的界面.尤其是SkeletonRenderer.Awake时,会瞬间出现大量 ...
说明: \c + a:表示ctrl+a \a + a:表示alt+a 命令列表: 1 移动: \c + a:将光标移到行首 \c + e:将光标移到行尾 \c + f:将光标向后(右)移动一个字符 \ ...
https://www.devexpress.com/Support/Center/Question/Details/K18516 To accomplish your task, please ex ...
基础知识介绍: 子表达式匹配 环视 引号内的字符串:"(^")*" 12小时制:(1[0123]|[1-9]):[0-5][0-9]*(am|pm) 24小时制:(([0 ...