Intel組合語言程式設計學習-第一章 基本概念

Thinker_0o0發表於2016-08-02

第一章基本概念

1.1  簡單介紹

    本書著重講述MS-Windows平臺上IA-32(Intel Architecture 32bit,英特爾32位體系架構)相容微處理器的組合語言程式設計,可以使用Intel或AMD的32位/64位處理器執行本所有例子。
    組合語言是有所程式設計語言中最古老的語言,它與計算機的機器語言最為接近,通過組合語言可以直接訪問計算機的硬體,所以要求讀者深入瞭解計算機體系結構和作業系統的大量細節。

1.1.1  一些精彩的提問

 (沒用的地方我都直接簡化或者刪除了啊!)
需要具備什麼背景知識?
    至少要學完一門程式設計的入門語言。
什麼是彙編器和連結器?
    彙編器是把組合語言源程式轉換為機器語言的實用工具程式。連結器是吧編譯器建立的多個單獨的檔案組合連線成可執行的應用程式的實用工具。另外一個工具稱為偵錯程式、允許在程式執行時單步執行並檢視暫存器和記憶體的內容。
需要什麼硬體和軟體?
    需要一臺裝配有Intel386,Intel486,Pentium或IA-32相容處理器的計算機。例如使用AMD系列處理器完全完全能夠正常工作。MASM相容從Windows95開始的所有32位版本的WIndows作業系統。一些與直接硬體訪問和磁碟扇區程式設計相關的程式必須在DOS,WIndows95/98/Me下執行,這是由於Windows NT/2000/XP有嚴格的安全限制。
能建立什麼型別地址模式程式?
    16位實地址模式程式
:16位實地址模式程式可以在MS-DOS或MS-Windows的控制檯視窗下執行。實地址模式程式也稱為真實模式程式,使用Intel8086/8088處理器要求的分段記憶體模式。
    32位保護模式程式:32位保護模式程式可執行所有32位版本的Windows作業系統上,通常比真實模式程式更加易於編寫,易於理解。

     為了更好的理解上面兩個模式,我又查了一些資料,發現其中一個說的比較詳細(http://blog.csdn.net/heiworld/article/details/24371677)。


通過本書能學到些什麼?
  1.計算機體系結構(也適用於Intel IA-32系列處理器)的基本原理。
  2.一些基本的布林邏輯概念以及它是如何用於程式設計和計算機硬體的。
  3.IA-32處理器如何管理記憶體,如何使用真實模式、保護模式和虛擬模式。
  4.高階語言編譯器(如C++)是如何將原始碼語句翻譯成組合語言和機器語言的。
  5.高階語言是如何在機器語言層次實現算是表示式。迴圈和邏輯結構的。
  6.資料的表示方法,包括有符號和無符號整數、實數以及字元資料。
  7.如何在機器語言層次除錯程式。對於C/C++這樣的能夠訪問低層資料和硬體的語言來說,這種除錯能力尤為重要。
  8.應用程式是如何通過終端服務程式、系統呼叫和共享記憶體區域才做系統進行互動的。
  9.組合語言程式碼與C++程式之間的介面。
  10.穿件組合語言應用程式。
組合語言與機器語言有什麼關係?
    機器語言是一種數字語言,只有計算機的處理器(CPU)才能理解它。IA-32相容處理器能夠理解一種通用的機器語言。組合語言由使用短助記符的語句構成,如ADD,MOV,SUB和CALL等。組合語言通機器語言之間是一一對應的關係:一條彙編執行對應一條機器語言指令。
C++和Java等語言與組合語言有什麼關係?
一對多的關係,下面是我用vs2012反彙編的幾句程式碼:
bool bBool = true;
013313BE  mov  byte ptr [bBool],1   把1這個值直接放到指標指向位置


char cByte = 2;
013313C2  mov   byte ptr [cByte],2   同上


double fDouble = 3.0;              double的比較特別,之後會解釋
013313C6  movsd       xmm0,mmword ptr ds:[1335858h]  
013313CE  movsd       mmword ptr [fDouble],xmm0  



int nY = 3;                         同上
013313D3  mov         dword ptr [nY],3  


int nX = (4 + nY) * 3;
013313DA  mov         eax,dword ptr [nY]  先把Y放暫存器裡
013313DD  add         eax,4                       暫存器值加4
013313E0  imul        eax,eax,3                 暫存器的值=暫存器的值乘3
013313E3  mov         dword ptr [nX],eax  把當前暫存器值拷貝到X中


組合語言是可移植的嗎?
    並不能,因為組合語言總是為特定系列的處理器設計的。
為什麼要學習組合語言?(我的目的是為了瞭解彙編,然後去方便學習別的東西,而並不是作者所說的那樣詳細,下面是作者的想法)
  1.適合編寫嵌入式程式。
  2.一些實時應用(如模擬和硬體監控)要去精確計量時間並實時響應。高階語言不允許程式設計師完全通知編譯器生成的機器碼,不過組合語言允許程式設計師控制程式幾乎每個位元組。
  3.許多專用硬體裝置,有各種各樣的限制。
  4.組合語言有助於對計算機硬體、作業系統、應用程式之間互動的整體理解。使用匯編語言,可以隨時應用和校驗計算機體系結構和作業系統課上學習的知識和理論。
  5.應用程式設計師有時會發現高階語言中的種種限制會阻礙位操作和資料加密等底層操作的有效實現,他們一般會呼叫匯編語言編寫此過程。
  6.各種驅動。

1.1.2  組合語言應用程式

    前面說了一些,沒啥用直接省略了。
    C++中也可以使用匯編,這就是在使用高階結構和訪問低層細節之間提供了一種折中的方案,使用者可以使用匯編語言直接訪問硬體,但這將是程式完全喪失可移植性。大多數C++編譯器都具有生成組合語言原始碼的能力,程式設計師對生成組合語言程式碼進行精煉、優化後再便以為可執行檔案。

1.2  虛擬機器的概念

    虛擬機器的概念是說明計算機軟硬體之間相互關係的最佳途徑之一。計算機能夠執行機器語言書寫的程式,這種語言的每條指令都簡單到能用相對較少的電路單元即可執行。為簡化期間。我們稱這種語言為L0。
程式設計師使用L0語言程式設計非常困難,因為需要考慮非常低層、非常細微的地方,並且L0由純粹的數字構成,如果能構造一種更加易用的新語言L1的話,那麼程式可以用L1來編寫了,有兩種方法可以達到該目的的。
解釋方法:當執行用L1語言編寫的程式時,使用以L0語言編寫的解釋程式對L1程式的每條指令解碼並執行,這樣L1程式馬上可以執行,但是每條指令在執行之前都必須解碼。
翻譯方式:用特別設計編寫的L0程式將整個L1源程式翻譯成L0程式,生成的L0程式就可以直接在計算機硬體上執行了。(上面兩種方式讓我想起兩個JavaScript引擎,JavaScriptCore和V8,早期的JavaScriptCore就是採取解釋方法,效率比較低,而V8自從誕生就是為了效率,直接編譯成原生程式碼,而且跳過了位元組碼的階段。)
    每臺虛擬機器都可由硬體或軟體構成。人們可以為虛擬機器VM1編寫程式,如果虛擬機器VM1能夠實現為真實的計算機硬體,程式就可以直接在硬體上執行了。除此之外,為MV1編寫的程式也可以通過監視或翻譯的方法在虛擬機器VM0上執行。
    機器VM0和VM1不應該有根本的不同,否則翻譯和監視過程將過於耗時。如果VM1支援的語言對編寫應用程式的程式設計師不夠友好怎麼辦?繼續抽象,設計虛擬機器知道VMn,它支援的語言功能強大並且易於使用。
程式設計語言Java就是基於虛擬機器概念的,Java語言編寫的程式由Java編譯器翻譯成Java位元組碼,後者是一種低層語言,可以由Java虛擬機器(JVM)來快速執行。由於在許多不同的計算機系統上都時間了JVM,使得Java程式相對而言是與系統無關的。
具體實現:


數字邏輯(第0層):計算機的數字邏輯硬體用虛擬機器的第0層表示。
微結構(第一層):計算機晶片製造商通常不允許普通使用者編寫微指令,特殊的微結構指令通常是廠商祕密。像從記憶體中取數字並且加1這樣的基本操作可能需要3-4條維指令。
指令集體系結構(第2層):計算機晶片製造商設計了一套國華在未處理器內部的指令集,用於執行如移動、加法和乘法等基本操作,這套指令集稱為常規機器語言,或簡稱為機器語言。每條機器語言指令將分解成幾條偽指令執行。
作業系統(第3層):隨著計算機的發展,人們設計了其他能夠是程式設計師更加高產的虛擬機器。第3層的虛擬機器能夠理解使用者發出的注入載入執行程式、顯示目錄之類的互動命令,這就是眾所周知的計算機作業系統。作業系統軟體被翻譯成機器碼在第2層上執行。(作業系統的原始碼有C或組合語言寫成,一旦編譯之後,作業系統實際上不過是一個能夠解釋第3層命令的第2層程式。)
組合語言(第4層):在作業系統層次之上的程式設計語言提供了能夠實際用來開發大型軟體的翻譯層。組合語言屬於第4層,它使用ADD,SUB和MOV等很容易翻譯到指令集體系結構層(第2層)的短助記符,其他一些彙編語句(如中斷呼叫),則由作業系統(第3層)直接執行組合語言程式在執行前一般要全部翻譯(彙編)成機器語言。
高階語言(第5層):第5層是諸如C++,C#,VB和Java之類的高階語言,這些語言有功能強大的語句,每條語句通常被翻譯成4層的多條指令。在內部,編譯器把第5層的程式翻譯成第4層的程式程式碼,後者由編譯器會變成機器語言。

最後有一個章總結,因為沒有需要刪減和簡化的地方,直接貼上過來吧。




相關文章