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/

相關文章
相關標籤/搜索