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 |
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/