copy elision

 

 

 

 

 

 

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

1.2.2  数据传送指令spa

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

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

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

见到xor eax,eax,应该立刻明白这是清零操做。blog

可是实际上,有时候lea用来作和mov一样的事情,好比赋值。看下面一条指令:ci

lea edi,[ebp-0cch]

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

mov edi,ebp-0cch

可是以上mov指令是错误的,由于mov不支持后一个操做数中加入一个减号。可是lea支持,因此能够用lea来代替它。table

指令的操做数能采用的运算符号有很是复杂的限制。若是须要使用,应该查询指令手册。class

为了讲解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,分别对应于处理四、一、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/

相关文章
相关标签/搜索