结论:一样。编译器和编译器之间可能有点区别但是程序不会变。


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 汇编代码效率比较的更多相关文章

  1. linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作

    一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...

  2. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  3. 简单C程序生成的汇编代码分析

    首先给出完整的C代码: int g(int x) { ; } int f(int x) { return g(x); } int main(void) { )+; } 使用命令:gcc –S –o h ...

  4. uC/OS-II汇编代码

    ;*************************************************************************************************** ...

  5. 分析一个C语言程序生成的汇编代码-《Linux内核分析》Week1作业

    署名信息 郭春阳 原创作品转载请注明出处 :<Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 C源码 这 ...

  6. 20145311利用gdb调试汇编代码

    利用GDB调试汇编代码 首先编写c语言原代码,我使用的是同学分析过的代码 #include<stdio.h>short addend1 = 1;static int addend2 = 2 ...

  7. -fomit-frame-pointer 编译选项在gcc 4.8.2版本中的汇编代码研究

    #include void fun(void) { printf("fun"); } int main(int argc, char *argv[]){ fun(); return ...

  8. c++(vs上)与g++(linux下)对于++操作的汇编代码解读

    先来看一个代码,估计很多同学都碰到过其中的某一个. #include <stdio.h> #include <iostream> using namespace std; in ...

  9. 在汇编代码中调用C函数

    对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数 ...

随机推荐

  1. 【转】JS实现继承的几种方式

    既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; / ...

  2. hive使用derby的服务模式(可以远程模式)

    hive默认使用的derby的嵌入模式.这个就面临着,无法多个并发hive shell共享的问题. 使用MySQL服务器也可以解决问题,但安装.配置太麻烦了. 可以使用轻量级的derby的c/s服务模 ...

  3. win10下安装Jenkins

    Jenkins是一个基于java的持续集成工具,开源项目.用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.随着近几年docker技术的成熟和应用,很多公司开始大量尝试 ...

  4. HDU 6318 Swaps and Inversions 思路很巧妙!!!(转换为树状数组或者归并求解逆序数)

    Swaps and Inversions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. Linux--find命令和 xargs命令组合

    find 查找文件的命令,并可以做出相应的处理 命令格式: find filename [选项][-print -exec -ok ...] 选项参数: 1.-name :按照文件名称查找,可以提前c ...

  6. C#框架学习资料集锦

    1.AllEmpty 的[从零开始编写自己的C#框架]系列 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零 ...

  7. Spring第二天——IOC注解操作与AOP概念

    大致内容 spring的bean管理(注解实现) AOP原理 log4j介绍 spring整合web项目的演示 一.spring注解实现bean管理 注解: 代码中一些特殊的标记,使用注解也可以完成一 ...

  8. 20155237 2016-2017-2 《Java程序设计》第3周学习总结

    20155237 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 对象:存在的具体实体,具有明确的状态和行为. 类:具有相同属性和行为的一组 ...

  9. Scala中=>的用法

    1. 表示函数的类型(Function Type) 例如: def double(x: Int): Int = x*2 函数double的类型就是 (x: Int) => Int 或者 Int ...

  10. import require

    https://www.zhihu.com/question/56820346/answer/150743994