i++ i+=1 i=i+1 汇编代码效率比较
结论:一样。编译器和编译器之间可能有点区别但是程序不会变。
0x00
一直不清楚到底是因为懒还是真的为了效率,要把" i = i + 1 "写成" i++ "或者" i += 1 ",
今日闲来无事,尝试一下。
0x01
直接的赋值语句。
编译器:Dev-C++ 5.11
代码:
void asd() {}
int main() {
int i=;
i++;
asd(); //方便在IDA中区分上下文
i=i+;
asd();
i+=;
return ;
}
反汇编:
mov [rbp+i], 0 //i的初始化
add [rbp+i], 1 //i++;
call _Z3asdv ; asd(void)
add [rbp+i], 1 //i=i+1;
call _Z3asdv ; asd(void)
add [rbp+i], 1 //i+=1;
总结:一毛一样。
0x02
换个编译器
编译器:Microsoft Visual Studio 2013
代码:跟上边的一样
反汇编: //突然变得裹脚布
mov [ebp+i], 0 //i的初始化
mov eax, [ebp+i] //这三行是i++
add eax, 1 //先取出i放到eax,加1之后再放回去
mov [ebp+i], eax
call sub_41110E //void asd()
mov eax, [ebp+i] //这三行是i=i+1
add eax,
mov [ebp+i], eax
call sub_41110E //void asd()
mov eax, [ebp+i] //这三行是i+=1
add eax,
mov [ebp+i], eax
总结:一毛一样。
0x03
换一种语句,用for试试
编译器:Dev-C++ 5.11
代码:
void asd() {}
int main() {
int i;
for(i=; i<; i++) ;
asd();
for(i=; i<; i++) ;
asd();
for(i=; i<; i++) ;
asd();
return ;
}
反汇编: 总而言之还是那个样子。

0x04
换编译器:Microsoft Visual Studio 2013
代码:和上边一样
反汇编: 总而言之还是老样子。

0x05
还是不太放心
试试,如果是两个变量呢?
编译器:Dev-C++ 5.11
代码:
void asd() {}
int main() {
int i, j;
asd();
i=i+j;
asd();
i+=j;
asd();
return ;
}
反汇编:
call _Z3asdv ; asd(void)
mov eax, [rbp+var_8]
add [rbp+var_4], eax
call _Z3asdv ; asd(void)
mov eax, [rbp+var_8]
add [rbp+var_4], eax
call _Z3asdv ; asd(void)
一样。
0x06
总结:i++、i=i+1、i+=1, 效果一样。
i+=j、i=i+j,也是一样的
但是既然能够少写两个字符,为什么还要多写两个呢?
况且,用 i += j 的,总是看不起写 i = i + j 的。
i++ i+=1 i=i+1 汇编代码效率比较的更多相关文章
- linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作
一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- 简单C程序生成的汇编代码分析
首先给出完整的C代码: int g(int x) { ; } int f(int x) { return g(x); } int main(void) { )+; } 使用命令:gcc –S –o h ...
- uC/OS-II汇编代码
;*************************************************************************************************** ...
- 分析一个C语言程序生成的汇编代码-《Linux内核分析》Week1作业
署名信息 郭春阳 原创作品转载请注明出处 :<Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 C源码 这 ...
- 20145311利用gdb调试汇编代码
利用GDB调试汇编代码 首先编写c语言原代码,我使用的是同学分析过的代码 #include<stdio.h>short addend1 = 1;static int addend2 = 2 ...
- -fomit-frame-pointer 编译选项在gcc 4.8.2版本中的汇编代码研究
#include void fun(void) { printf("fun"); } int main(int argc, char *argv[]){ fun(); return ...
- c++(vs上)与g++(linux下)对于++操作的汇编代码解读
先来看一个代码,估计很多同学都碰到过其中的某一个. #include <stdio.h> #include <iostream> using namespace std; in ...
- 在汇编代码中调用C函数
对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数 ...
随机推荐
- MySQL——总结
数据库命令:创建create database 数据库名 charset=utf8;删除drop database 数据库名;查看所有数据库:show databases;使用数据库:use 数据库名 ...
- Python之Cubes框架使用
本文主要内容包含Cubes框架的介绍和简单使用. 一. 介绍和安装 Cubes是一个轻量级的Python框架和一套工具,用于开发报告和分析应用程序,在线分析处理(OLAP),多维分析和聚合数据的浏览. ...
- CommonJS、AMD、CMD、NodeJs、RequireJS到底有什么联系?
JS中的模块规范(CommonJS,AMD,CMD),如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范,本文包括这三个规范的来源及对应的产物的原理. 一.C ...
- Hdu4952 - Number Transformation - 数论(2014 Multi-University Training Contest 8)
寻找1~k内i的倍数.则这个数能够看成i*x,则下一个数为(i+1)*y,(i+1)*y>=i*x,那么能够推出.y=x-x/(i+1); 那么当x<i+1时,y==x.之后的循环也不会改 ...
- python-greenlet模块(协程)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 from greenlet import greenlet def test1(): print(12) ...
- Android ViewPager里的所有图片设置监听打开同一活动显示不同图片
Android ViewPager里的所有图片设置监听请看前一文章 为了省时所以2层菜单只做一个点击任意图片后显示相应图片的活动 关键点是每个点击对应的图片如何传参给显示的活动 因为只启动一个活动,所 ...
- python3爬虫-下载网易云音乐,评论
# -*- coding: utf-8 -*- ''' 16位随机字符的字符串 参数一 获取歌曲下载地址 "{"ids":"[1361348080]" ...
- Weblogic申请和配置SSL证书
一. 概述 SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协 ...
- 【11.18总结】从SAML出发在重定向中发现的XSS漏洞
Write-up地址:How I Discovered XSS that Affects around 20 Uber Subdomains 作者:fady mohammed osman 总算回家了, ...
- linux下使用shell脚本获取终端宽度
获取终端大小时候的学习 学习日期:2018/11/3 问题来源: 在写shell脚本时想输出一行占满整个终端屏幕宽度的 横杠 发现for循环会导致执行缓慢 解决方法: 使用yes 命令 sed '50 ...