彙編學習體會(一)
近期利用空閒時間學習了一下彙編,一是為了對計算機底層有多一些瞭解,希望對自己編碼有更好的幫助,
二就是出於好奇和興趣。目前打算分兩篇將自己所學習的筆記和心得整理出來,此篇是第一篇,整理出來自己初學
彙編的一些基本知識點和體會,第二篇整理出簡單的彙編的例子,好比學習高階語言的時候,會先寫HelloWorld
和一些簡單的實現,可以更好的理解所學語言,都是彙編中很基本內容,但初步達到了自己初學彙編的目的,有更
多時間和精力的情況下,就再進行進一步的學習吧。
下面淺談幾點自己的收穫和體會:
1. 從CPU的角度考慮問題:我們在應用軟體開發的過程中,我們將業務抽象成為類,將業務邏輯封裝在物件
裡,在開發時我們
框架,使用封裝好的Spiders , 爬蟲就是Spiders , 管理使用這些個Spider , 考慮問題非常接近實際生活中的思維。
在彙編時,我們說,就當是我們在面對CPU程式設計,需要從CPU的角度來考慮問題,最終執行程式的是CPU,CPU
通過匯流排與其他器件進行互動,所以先了解一下CPU的主要結構:
運算器:資訊處理;
暫存器:資訊儲存;
控制器:控制各器件進行工作;
內部匯流排連線各種器件,在它們中間進行資料的傳送;
其中暫存器是CPU中的主要部件,所以我們來看一下以x86系列為例的CPU的部分主要暫存器 :
eax : 累加暫存器 功能是運算
ebx : 基址暫存器 儲存記憶體地址
ecx : 計數暫存器 計算迴圈次數
edx: 資料計數器 儲存資料
當然,我們暫時只是列舉幾個簡單的暫存器先作為了解,後面我們再循序漸進的做更多學習。
2. 彙編程式的實際構成:CPU在執行程式時執行機器語言,組合語言已經非常接近機器語言,不過也需編譯
為機器碼再執行。翻看計算機的歷史,在使用二進位制的指令之後,便出於效率和使用難易度等原因,發展出了彙編
語言,至現在發展出我們現在使用的高階語言。我這裡將彙編程式的構成分為兩部分:
第一部分:彙編指令;
第二部分:偽指令; 其他符號;標號;
第一部分是彙編指令,有對應的機器碼,彙編指令是機器碼的助記符號。第二部分都由編譯器識別和執行,沒
對應的機器碼。其他符號如+、-、*、/。標號比如在segment前作為段名。偽指令常見的有:
segment 和ends:一個彙編程式由多個段組成。成對出現定義段開始、段結束;
end:整個程式結束標記;
assume:編譯時可以將段暫存器和某一個具體的段想聯絡(ps:類比理解一下java中的import);
proc 和endp : 表示過程的範圍。以實現程式“低耦合”“高聚合”;
第二部分針對編譯器,第一部分彙編指令則和CPU進行的操作對應,即是對CPU的指令,我們的應用程式解決
了龐大複雜的業務問題,CPU中一個個指令級別的“原子”操作完成了這些複雜的多變的實現。下面看幾個簡
單的操作碼及其應用示例:
mov A, B 把B的值賦給A
and A, B 把A、B的值相加,並將結果賦給A
push A 把A的值儲存在棧中
pop A 從棧中讀取中值,並將其賦給A
call X 呼叫函式X
ret 無 將處理返回到函式的呼叫源
為保障文章篇幅的簡潔性,其他更多指令可百度查詢其功能。
3. 我們首先了解了組合語言的構思程式的出發點在CPU,並且簡單熟悉了一下彙編的程式組成,那麼我們可以
考慮一下對應我們常用的高階語言如java、python,彙編是如何實現高階語言所封裝的功能呢。在應用程式的
層面上,我們會使用譬如常見MVC、三層架構或策略模式等等設計模式和架構組成,這些基於高階語言來實現
高階語言的實現又涉及到編譯連結、作業系統甚至組成等太多內容,這裡我們只關注組合語言對於高階語言編寫
的部分程式的實現,比如函式呼叫,以及我們學習任何一門語言都會使用的迴圈(for)實現和條件分支(if)的
實現,這些我們在寫程式中重要且很基本的內容,也是計算機作為資訊處理工具的本質的部分實現。