http://book.51cto.com/art/200810/93007.htm

1.2.2  数据传送指令

mov:数据移动。第一个参数是目的,第二个参数是来源。在C语言中相当于赋值号。这是最广为人知的指令。

xor:异或。这虽然是逻辑运算的指令,但是有趣的是,xor eax,eax这样的操作常常用来代替mov eax,0。好处是速度更快,占用字节数更少。

lea:取得地址(第二个参数)后放入到前面的寄存器(第一个参数)中。

见到xor eax,eax,应该马上明白这是清零操作。

但是实际上,有时候lea用来做和mov同样的事情,比如赋值。看下面一条指令:

lea edi,[ebp-0cch]

方括弧表示存储器,也就是ebp-0cch这个地址所指的存储器内容。但是lea要求取[ebp-0cch]的地址,那么地址也就是ebp-0cch,这个地址将被放入到edi中。换句话说,这等同于:

mov edi,ebp-0cch

但是以上mov指令是错误的,因为mov不支持后一个操作数中加入一个减号。但是lea支持,所以可以用lea来代替它。

指令的操作数能采用的运算符号有非常复杂的限制。如果需要使用,应该查询指令手册。

为了讲解stos,下面解说前面提到的代码:

 mov  ecx,30h
mov  eax,0CCCCCCCCh
rep   stos dword ptr es:[edi]

stos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中,同时,edi会增加4(字节数)。rep使指令重复执行ecx中填写的次数。方括弧表示存储器,这个地址实际上就是edi的内容所指向的地址。这里的stos其实对应的是stosd,其他还有stosb、stosw,分别对应于处理4、1、2个字节,这里对堆栈中30h*4(0c0h)个字节初始化为0cch(也就是int 3指令的机器码),这样发生意外时执行堆栈里面的内容会引发调试中断。

https://msdn.microsoft.com/en-us/library/8dbf701c.aspx

https://msdn.microsoft.com/en-us/library/dd778695.aspx

https://msdn.microsoft.com/en-us/library/aa290051.aspx

http://preshing.com/20110807/the-cost-of-buffer-security-checks-in-visual-c/

http://blog.osom.info/2012/02/understanding-vs-c-compilers-buffer.html

http://baike.baidu.com/view/674171.htm?fromtitle=%E5%BC%82%E6%88%96%E8%BF%90%E7%AE%97&fromid=720417&type=syn

http://www.cnblogs.com/baihmpgy/p/4331500.html

http://news.cnblogs.com/n/516935/

http://news.cnblogs.com/n/516947/

copy elision的更多相关文章

  1. C++ Copy Elision

    故事得从 copy/move constructor 说起: The default constructor (12.1), copy constructor and copy assignment ...

  2. Copy elision in C++

    Copy elision (or Copy omission) is a compiler optimization technique that avoids unnecessary copying ...

  3. C++的Copy Elision导致的奇怪问题

    最近写设计模式作业的时候, 有一个作业是实现装饰器模式 (Decorator Pattern), 由于我不会 Java, 所以只能用 C++ 来实现 在这个背景下, 会有简单(表意)的几个类, 如下: ...

  4. copy elison & RVO & NRVO

    蓝色的博文 To summarize, RVO is a compiler optimization technique, while std::move is just an rvalue cast ...

  5. Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source project ...

  6. 翻译「C++ Rvalue References Explained」C++右值引用详解 Part6:Move语义和编译器优化

    本文为第六部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.ht ...

  7. move和转发

    总的来说C++09跟C++98相比的变化是极其重大的.这个变化体现在三个方面,一个是形式上的变化,即在编码形式层面的支持,也就是对应我们所谓的编程范式(paradigm).C++09不会引入新的编程范 ...

  8. C++临时对象以及针对其进行的优化

    C++临时对象以及针对其进行的优化 C++中真正的临时对象是看不见的,它们不出现在你的源代码中. 那么什么时候回产生临时对象呢?主要是三个时刻: 产生临时对象的三个时刻: 用构造函数作为隐式类型转换函 ...

  9. Google C++ 代码规范

    Google C++ Style Guide   Table of Contents Header Files Self-contained Headers The #define Guard For ...

随机推荐

  1. kernel/vsprintf.c

    /* *  linux/kernel/vsprintf.c * *  Copyright (C) 1991, 1992  Linus Torvalds */ /* vsprintf.c -- Lars ...

  2. JQUERY中 .each()的用法。

    .each()方法的两个简单例子 用法1. <script type="text/javascript"> $("#dianji").click(f ...

  3. Apache2 部署 Django

    环境: debian8 apache2.4.10                    #请注意自己的apache版本,不同版本配置文件结构差异很大 django1.10 python3.4 默认ap ...

  4. java读取properties文件工具

    public class PropertiesUtil { public static String get(String filePath, String key) { String val = n ...

  5. Java中的构造代码块

    代码块 ----a静态代码块 ----b构造代码块 ----c普通代码块 执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. a.静态代码块: 静态代码块 ...

  6. etcd第一集

    网站:https://github.com/coreos/etcd 一些观点:https://yq.aliyun.com/articles/11035 1.etcd是键值存储仓库,配置共享和服务发现2 ...

  7. BRISK: Binary Robust Invariant Scalable Keypoints

    注意:本文含有一些数学公式,如果chrome不能看见公式的话请用IE打开网站 1.特征点提取   特征点提取有以下几个步骤: a.尺度空间金字塔结构的构造 和SIFT类似,尺度空间金字塔是由不同的尺度 ...

  8. Today I learnt

    2015-May-22 In Oracle database, dropping a table don't free up the space directly. You'll need to di ...

  9. IT荐书|10个最“牛叉”的代码注释

    下面是 网友针对“你看到过的最好的代码注释是什么样的?”这个问题给出的回答的前10条: 1. // 亲爱的维护者: // 如果你尝试了对这段程序进行‘优化’, // 并认识到这种企图是大错特错,请增加 ...

  10. redis缓存

    参考: java对redis的基本操作 http://www.cnblogs.com/edisonfeng/p/3571870.html 一.支持类型: key:一般设计为标准的字符串, values ...