1. 程式人生 > >彙編學習體會(一)

彙編學習體會(一)

近期利用空閒時間學習了一下彙編,一是為了對計算機底層有多一些瞭解,希望對自己編碼有更好的幫助,

二就是出於好奇和興趣。目前打算分兩篇將自己所學習的筆記和心得整理出來,此篇是第一篇,整理出來自己初學

彙編的一些基本知識點和體會,第二篇整理出簡單的彙編的例子,好比學習高階語言的時候,會先寫HelloWorld

和一些簡單的實現,可以更好的理解所學語言,都是彙編中很基本內容,但初步達到了自己初學彙編的目的,有更

多時間和精力的情況下,就再進行進一步的學習吧。

下面淺談幾點自己的收穫和體會:

1. 從CPU的角度考慮問題:我們在應用軟體開發的過程中,我們將業務抽象成為類,將業務邏輯封裝在物件

裡,在開發時我們

說是面向物件程式設計。有一個非常直觀的例子:之前做的爬蟲的專案,使用Scrapy-redis這個

框架,使用封裝好的Spiders , 爬蟲就是Spiders , 管理使用這些個Spider , 考慮問題非常接近實際生活中的思維。

在彙編時,我們說,就當是我們在面對CPU程式設計,需要從CPU的角度來考慮問題,最終執行程式的是CPU,CPU

通過匯流排與其他器件進行互動,所以先了解一下CPU的主要結構:

 運算器:資訊處理;

  暫存器:資訊儲存;

控制器:控制各器件進行工作;

內部匯流排連線各種器件,在它們中間進行資料的傳送;

其中暫存器是CPU中的主要部件,所以我們來看一下以x86系列為例的CPU的部分主要暫存器 :

 eax : 累加暫存器 功能是運算

  ebx : 基址暫存器 儲存記憶體地址

  ecx : 計數暫存器 計算迴圈次數

  edx: 資料計數器 儲存資料

當然,我們暫時只是列舉幾個簡單的暫存器先作為了解,後面我們再循序漸進的做更多學習。

2. 彙編程式的實際構成:CPU在執行程式時執行機器語言,組合語言已經非常接近機器語言,不過也需編譯

為機器碼再執行。翻看計算機的歷史,在使用二進位制的指令之後,便出於效率和使用難易度等原因,發展出了彙編

語言,至現在發展出我們現在使用的高階語言。我這裡將彙編程式的構成分為兩部分:

第一部分:彙編指令

第二部分:偽指令; 其他符號;標號;

第一部分是彙編指令,有對應的機器碼,彙編指令是機器碼的助記符號。第二部分都由編譯器識別和執行,沒

對應的機器碼。其他符號如+、-、*、/。標號比如在segment前作為段名。偽指令常見的有:

  segmentends:一個彙編程式由多個組成。成對出現定義段開始、段結束;

 end:整個程式結束標記;

  assume:編譯時可以將段暫存器和某一個具體的段想聯絡(ps:類比理解一下java中的import);

procendp : 表示過程的範圍。以實現程式“低耦合”“高聚合”;

第二部分針對編譯器,第一部分彙編指令則和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)的

實現,這些我們在寫程式中重要且很基本的內容,也是計算機作為資訊處理工具的本質的部分實現。