zoukankan      html  css  js  c++  java
  • copy elision

    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/

  • 相关阅读:
    手机端局部滚动问题 overflow-y:auto|scroll无效,使用iscroll解决
    h5 js 图片预览并判断 ajax上传
    安装一些包管理的记录 win10
    nginx php rewrite配置
    记一次u盘 无法格式化、0字节、写保护的解决过程
    erlang,elixir安装
    Redis详解:lists数据类型及操作
    redis类型[string 、list 、 set 、sorted set 、hash]
    java 生成Word文档
    mysql 获取当前月最后一天和第一天
  • 原文地址:https://www.cnblogs.com/Cmpl/p/4341827.html
Copyright © 2011-2022 走看看