Intel彙編語言程序設計學習-第一章 基本概念

第一章基本概念

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層的程序代碼,後者由編譯器會變成機器語言。

最後有一個章總結,由於沒有須要刪減和簡化的地方,直接粘貼過來吧。編程


相關文章
相關標籤/搜索