《深刻理解計算機系統》第三章——程序的機器級表示。做者首先講解了彙編代碼和機器代碼的關係,闡述了彙編承上啓下的做用;接着從機器語言IA32着手,分別講述瞭如何存儲數據、如何訪問數據、如何完成運算以及如何進行跳轉。經過這些步驟,又告訴了咱們分支語句、循環語句是怎麼完成的,函數調用、棧幀結構以及遞歸過程。最後能經過編譯器產生的彙編代碼表示,咱們要了解編譯器和它的優化能力,知道編譯器能爲咱們完成哪些工做。html
而這篇博客咱們將講解彙編和機器代碼的關係。首先下面一張圖是C語言、彙編語言以及翻譯過的機器語言,你們能夠先有個大概的眼熟。java
上圖引用至:http://www.jianshu.com/p/c60a9c2131c3python
這系列博客第一篇 Hello World是如何運行的 咱們就詳細講解了程序的編譯,一個C語言程序是通過編譯器變成彙編程序,而後經過彙編器變成機器代碼,最後被計算機執行。程序員
計算機是不能直接識別咱們所編寫的C程序或者Java程序的。它只能識別機器語言,而機器語言是用二進制代碼表示的計算機能直接識別和執行的一種機器指指令系統令的集合。算法
早期計算機就是指能夠執行機器指令,進行運算的機器。在咱們經常使用的PC機中,有一個芯片,就是咱們常說的CPU(Central Processing Unit,中央處理單元)能夠完成前面所說的計算機的功能,可是每一種這樣的微處理器(CPU)因爲硬件設計和內部結構的不一樣,就須要用不一樣的電平脈衝來控制,使它工做。因此每一種微處理器都有本身的機器指令集,也就是機器語言。編程
早期的程序設計均使用機器語言。程序員們將用0, 1數字編成的程序代碼打在紙帶或卡片上,1打孔,0不打孔,再將程序經過紙帶機或卡片機輸入計算機,進行運算。編程語言
用機器語言編寫程序,編程人員要首先熟記所用計算機的所有指令代碼和代碼的涵義。手編程序時,程序員得本身處理每條指令和每一數據的存儲分配和輸入輸出,還得記住編程過程當中每步所使用的工做單元處在何種狀態。這是一件十分繁瑣的工做。編寫程序花費的時間每每是實際運行時間的幾十倍或幾百倍,並且,編出的程序全是些0和1的指令代碼,直觀性差,還容易出錯。函數
那麼該怎麼辦呢?這時候彙編語言便產生了。工具
須要注意的是如今除了計算機生產廠家的專業人員外,通常是不須要學習機器語言了。學習
彙編語言的主體是彙編指令。彙編指令和機器指令的差異在於指令的表示方法上,彙編指令是機器指令便於記憶的書寫格式。
好比下面將寄存器 BX 的內容發送到 AX 上:
操做:寄存器BX的內容送到AX中 1000100111011000 機器指令 mov ax,bx 彙編指令
咱們能很明顯的從上面兩條指令看出區別,彙編指令相對於機器指令是很容易記住的。
可能有人會問,咱們用匯編語言編寫程序,但是計算機只認識機器指令,那該怎麼辦?這時候就須要一個能將彙編語言轉換成機器指令的工具,咱們稱其爲編譯器。程序員用匯編語言寫出源代碼,再用匯編編譯器將其編譯爲機器碼,最後由計算機執行。
彙編語言是直接面向處理器(Processor)的程序設計語言。處理器是在指令的控制下工做的,處理器能夠識別的每一條指令稱爲機器指令。每一種處理器都有本身能夠識別的一整套指令,稱爲指令集。處理器執行指令時,根據不一樣的指令採起不一樣的動做,完成不一樣的功能,既能夠改變本身內部的工做狀態,也能控制其它外圍電路的工做狀態。
彙編語言的另外一個特色就是它所操做的對象不是具體的數據,而是寄存器或者存儲器,也就是說它是直接和寄存器和存儲器打交道,這也是爲何彙編語言的執行速度要比其它語言快,但同時這也使編程更加複雜,由於既然數據是存放在寄存器或存儲器中,那麼必然就存在着尋址方式,也就是用什麼方法找到所須要的數據。例如上面的例子,咱們就不能像高級語言同樣直接使用數據,而是先要從相應的寄存器AX、BX 中把數據取出。這也就增長了編程的複雜性,由於在高級語言中尋址這部分工做是由編譯系統來完成的,而在彙編語言中是由程序員本身來完成的,這無異增長了編程的複雜程度和程序的可讀性。
再者,彙編語言指令是機器指令的一種符號表示,而不一樣類型的CPU 有不一樣的機器指令系統,也就有不一樣的彙編語言,因此,彙編語言程序與機器有着密切的關係。因此,除了同系列、不一樣型號CPU 之間的彙編語言程序有必定程度的可移植性以外,其它不一樣類型(如:小型機和微機等)CPU 之間的彙編語言程序是沒法移植的,也就是說,彙編語言程序的通用性和可移植性要比高級語言程序低。
總結起來就是三個特色:機器相關性、高速度和高效率、編寫和調試複雜(相對於高級語言)。
前面的機器語言和彙編語言咱們都有必定了瞭解了,彙編語言也是和機器語言同樣,都是直接對硬件進行操做,可是彙編語言指令採用了英文縮寫的標識符,更容易識別和記憶。可是提及來更容易識別和記憶,也只是相對於機器語言而言的。在實際編程中,彙編語言源程序也是十分複雜和冗長的,這時候高級語言產生了。
高級語言並非指一種語言,而是包括不少編程語言,好比Java、C、C++、C#、python等等,是高度封裝的編程語言。高級語言與計算機的硬件結構和指令系統無關,它有更強的表達能力,可方便地表示數據的運算和程序的控制結構,能更好的描述各類算法,並且容易學習掌握。但高級語言編譯生成的程序代碼通常比用匯編程序語言設計的程序代碼要長,執行的速度也慢。
從最開始咱們給出的一張圖也能夠看出,C語言寫出的短短几行代碼,翻譯成彙編語言會多不少,更不用說變成機器語言了。
首先我要說明的是,咱們不須要學會如何用機器語言,彙編語言來進行編程,畢竟咱們不是計算機生產廠家的專業人員。咱們所要知道的是如何看懂彙編語言就好了。由於在咱們所編寫的高級語言,被翻譯成彙編語言時,編譯器會自動進行一些優化處理,而這些處理若是咱們不知道,就會形成程序上的錯誤,具體實例後面會詳細講到。
下一篇博客咱們將講解一個簡單的彙編程序實例。