這篇文章我并不打算一頭栽進細節中向你干癟無味地闡述匯編指令,因為寫這邊文章的目的實際上是為了讓你更好的使用c++,對于沒有接觸匯編的c++的程序員這篇文章很是值得一讀,因為在學習匯編后我覺得寫c++代碼更有把握了,同時還有一個好處,我的調試能力提高了不少,一切都基于我自己的學習經歷,相信沒有什么比實踐經驗更有說服力了,準備好了嗎?讓我們進入正題。
c++中其實有很多c沒有的特性,即使是c,所謂的函數你真正搞清楚運作機制沒有?變量的讀寫本質又是怎樣的?再提升到c++上來說,構造函數什么時候被調用?c++的對象到底是怎么運作的?虛函數呢?我承認我是故意用這么多連續的問句在造勢,然后這么無非為了形成一種反差,因為當你粗略的學習下匯編后,你完全就有能力搞清楚這一切的問題,再多的問號到時候都會被你畫上完美的句號,強調一下,解決這一切問題,你需要的就是粗略的學習下匯編!原因很簡單,高級語言編譯出的匯編代碼大部分不會涉及到什么高深的匯編技巧,我們需要掌握的就是一些基本的匯編指令,以及匯編的基本語法,就有了足夠的能力去把上面說的問題一一搞定。好的讓我給你一個學習匯編的大綱:
一. 在網上搜“匯編快速入門”這種關鍵字,然后讀幾篇文章,對匯編有個大致的了解,驗收準則就是知道mov eax, 2這種語句實際就是高級語言中讀寫變量的中間步驟,cmp eax, ebx這種語句會設置標志位寄存器,還有mov eax, fs:[0],這條語句是學SEH機制時遇到的,fs:[0]保存的是一個線程環境結構體,這條語句不用作為驗收準則,我是順便說說而已- -!
二. 這個很重要了,也就是函數調用在匯編層如何實現,驗收準則是:知道函數傳參數的兩種方式,包括棧傳參,寄存器傳參,寄存器傳參數的應用就是c++中每個成員函數都會被傳入一個this指針,實際就是用的寄存器傳參。然后是知道棧幀的概念,知道現場保護的概念,實際上我這段話里已經有很多關鍵字可以用來在網上搜了,絕對可以找到很多詳細資料。
當這兩大點你覺得你已經有知識儲備了,那么我們就可以踏上實踐的征途了!我假設你用的是vc,你可以隨意寫一些程序,但是要保證有自己寫的函數的調用,然后讓程序在調試模式下跑起來,再然后轉到匯編代碼的形式,基本上,現在已經有足夠的環境聯系你的讀匯編代碼的能力了,到這里就沒什么好的方法了,不停的讀吧,不明白就查資料,然后再讀,反復幾次,效果自然就出來了。等你有能力看明白函數調用究竟是怎么一回事,基本上你就可以試著去寫點c++代碼來解讀了!因為在你理解函數如何實現的過程中,你對匯編編程的方式已經有了完整的認識,雖然不細致,但是那又怎么樣?能看明白就行了,以后有遇到什么細節問題,也不過就是查查資料而已。
這篇玩意可能沒能讓你哪怕學到一點匯編的知識,也沒能讓你對c++有更深刻的理解,但是至少我慫恿你學匯編成功了,不是嗎?