計算機(jī)系統(tǒng)匯編語言和機(jī)器語言深入理解
引言
《深入理解計算機(jī)系統(tǒng)》第三章——程序的機(jī)器級表示。作者首先講解了匯編代碼和機(jī)器代碼的關(guān)系,闡述了匯編承上啟下的作用;
接著從機(jī)器語言IA32著手,分別講述了如何存儲數(shù)據(jù)、如何訪問數(shù)據(jù)、如何完成運算以及如何進(jìn)行跳轉(zhuǎn)。通過這些步驟,又告訴了我們分支語句、循環(huán)語句是怎么完成的,函數(shù)調(diào)用、棧幀結(jié)構(gòu)以及遞歸過程。
最后能通過編譯器產(chǎn)生的匯編代碼表示,我們要了解編譯器和它的優(yōu)化能力,知道編譯器能為我們完成哪些工作。
而這篇博客我們將講解匯編和機(jī)器代碼的關(guān)系。首先下面一張圖是C語言、匯編語言以及翻譯過的機(jī)器語言,大家可以先有個大概的眼熟。
1、機(jī)器語言
這系列博客第一篇 Hello World是如何運行的 我們就詳細(xì)講解了程序的編譯,一個C語言程序是經(jīng)過編譯器變成匯編程序,然后通過匯編器變成機(jī)器代碼,最后被計算機(jī)執(zhí)行。
計算機(jī)是不能直接識別我們所編寫的C程序或者Java程序的。它只能識別機(jī)器語言,而機(jī)器語言是用二進(jìn)制代碼表示的計算機(jī)能直接識別和執(zhí)行的一種機(jī)器指指令系統(tǒng)令的集合。
早期計算機(jī)就是指可以執(zhí)行機(jī)器指令,進(jìn)行運算的機(jī)器。在我們常用的PC機(jī)中,有一個芯片,就是我們常說的CPU(Central Processing Unit,中央處理單元)可以完成前面所說的計算機(jī)的功能,但是每一種這樣的微處理器(CPU)由于硬件設(shè)計和內(nèi)部結(jié)構(gòu)的不同,就需要用不同的電平脈沖來控制,使它工作。所以每一種微處理器都有自己的機(jī)器指令集,也就是機(jī)器語言。
早期的程序設(shè)計均使用機(jī)器語言。程序員們將用0, 1數(shù)字編成的程序代碼打在紙帶或卡片上,1打孔,0不打孔,再將程序通過紙帶機(jī)或卡片機(jī)輸入計算機(jī),進(jìn)行運算。
用機(jī)器語言編寫程序,編程人員要首先熟記所用計算機(jī)的全部指令代碼和代碼的涵義。手編程序時,程序員得自己處理每條指令和每一數(shù)據(jù)的存儲分配和輸入輸出,還得記住編程過程中每步所使用的工作單元處在何種狀態(tài)。這是一件十分繁瑣的工作。編寫程序花費的時間往往是實際運行時間的幾十倍或幾百倍,而且,編出的程序全是些0和1的指令代碼,直觀性差,還容易出錯。
那么該怎么辦呢?這時候匯編語言便產(chǎn)生了。
需要注意的是現(xiàn)在除了計算機(jī)生產(chǎn)廠家的專業(yè)人員外,一般是不需要學(xué)習(xí)機(jī)器語言了。
2、匯編語言
匯編語言的主體是匯編指令。匯編指令和機(jī)器指令的差別在于指令的表示方法上,匯編指令是機(jī)器指令便于記憶的書寫格式。
比如下面將寄存器 BX 的內(nèi)容發(fā)送到 AX 上:
操作:寄存器BX的內(nèi)容送到AX中 1000100111011000 機(jī)器指令 mov ax,bx 匯編指令
我們能很明顯的從上面兩條指令看出區(qū)別,匯編指令相對于機(jī)器指令是很容易記住的。
可能有人會問,我們用匯編語言編寫程序,可是計算機(jī)只認(rèn)識機(jī)器指令,那該怎么辦?這時候就需要一個能將匯編語言轉(zhuǎn)換成機(jī)器指令的工具,我們稱其為編譯器。程序員用匯編語言寫出源代碼,再用匯編編譯器將其編譯為機(jī)器碼,最后由計算機(jī)執(zhí)行。
- 匯編語言是直接面向處理器(Processor)的程序設(shè)計語言。處理器是在指令的控制下工作的,處理器可以識別的每一條指令稱為機(jī)器指令。每一種處理器都有自己可以識別的一整套指令,稱為指令集。處理器執(zhí)行指令時,根據(jù)不同的指令采取不同的動作,完成不同的功能,既可以改變自己內(nèi)部的工作狀態(tài),也能控制其它外圍電路的工作狀態(tài)。
- 匯編語言的另一個特點就是它所操作的對象不是具體的數(shù)據(jù),而是寄存器或者存儲器,也就是說它是直接和寄存器和存儲器打交道,這也是為什么匯編語言的執(zhí)行速度要比其它語言快,但同時這也使編程更加復(fù)雜,因為既然數(shù)據(jù)是存放在寄存器或存儲器中,那么必然就存在著尋址方式,也就是用什么方法找到所需要的數(shù)據(jù)。
例如上面的例子,我們就不能像高級語言一樣直接使用數(shù)據(jù),而是先要從相應(yīng)的寄存器AX、BX 中把數(shù)據(jù)取出。這也就增加了編程的復(fù)雜性,因為在高級語言中尋址這部分工作是由編譯系統(tǒng)來完成的,而在匯編語言中是由程序員自己來完成的,這無異增加了編程的復(fù)雜程度和程序的可讀性。 - 匯編語言指令是機(jī)器指令的一種符號表示,而不同類型的CPU 有不同的機(jī)器指令系統(tǒng),也就有不同的匯編語言,所以,匯編語言程序與機(jī)器有著密切的關(guān)系。所以,除了同系列、不同型號CPU 之間的匯編語言程序有一定程度的可移植性之外,其它不同類型(如:小型機(jī)和微機(jī)等)CPU 之間的匯編語言程序是無法移植的,也就是說,匯編語言程序的通用性和可移植性要比高級語言程序低。
總結(jié)起來就是三個特點:機(jī)器相關(guān)性、高速度和高效率、編寫和調(diào)試復(fù)雜(相對于高級語言)。
3、高級語言
前面的機(jī)器語言和匯編語言我們都有一定了了解了,匯編語言也是和機(jī)器語言一樣,都是直接對硬件進(jìn)行操作,但是匯編語言指令采用了英文縮寫的標(biāo)識符,更容易識別和記憶。但是說起來更容易識別和記憶,也只是相對于機(jī)器語言而言的。在實際編程中,匯編語言源程序也是十分復(fù)雜和冗長的,這時候高級語言產(chǎn)生了。
高級語言并不是指一種語言,而是包括很多編程語言,比如Java、C、C++、C#、python等等,是高度封裝的編程語言。高級語言與計算機(jī)的硬件結(jié)構(gòu)和指令系統(tǒng)無關(guān),它有更強(qiáng)的表達(dá)能力,可方便地表示數(shù)據(jù)的運算和程序的控制結(jié)構(gòu),能更好的描述各種算法,而且容易學(xué)習(xí)掌握。但高級語言編譯生成的程序代碼一般比用匯編程序語言設(shè)計的程序代碼要長,執(zhí)行的速度也慢。
從最開始我們給出的一張圖也可以看出,C語言寫出的短短幾行代碼,翻譯成匯編語言會多很多,更不用說變成機(jī)器語言了。
總結(jié)
首先我要說明的是,我們不需要學(xué)會如何用機(jī)器語言,匯編語言來進(jìn)行編程,畢竟我們不是計算機(jī)生產(chǎn)廠家的專業(yè)人員。我們所要知道的是如何看懂匯編語言就行了。因為在我們所編寫的高級語言,被翻譯成匯編語言時,編譯器會自動進(jìn)行一些優(yōu)化處理,而這些處理如果我們不知道,就會造成程序上的錯誤,具體實例后面會詳細(xì)講到。
以上就是計算機(jī)系統(tǒng)匯編語言和機(jī)器語言深入理解的詳細(xì)內(nèi)容,更多關(guān)于計算機(jī)系統(tǒng)匯編機(jī)器語言的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
從匯編代碼開始全面解析synchronized還原最真實的偏向鎖
這篇文章主要為大家介紹了從模板解釋器匯編源碼開始分析還原最真實的偏向鎖實現(xiàn),解釋monitorenter字節(jié)碼命令的方法開始,從匯編代碼開始全面解析synchronized2022-02-02匯編程序設(shè)計之DOSBox模擬環(huán)境配置
最近在學(xué)習(xí)匯編語言設(shè)計,然后上網(wǎng)找關(guān)于匯編程序的編譯軟件,不負(fù)有心人,終于找到了我需要的軟件,值得慶幸2023-08-08UEFI開發(fā)實戰(zhàn)用戶交互界面使用說明UNI文件
這篇文章主要為大家介紹了UEFI開發(fā)實戰(zhàn)用戶交互界面使用說明UNI文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06匯編語言XOR指令:對兩個操作數(shù)進(jìn)行邏輯(按位)異或操作(推薦)
匯編語言(assembly language)是一種用于電子計算機(jī)、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。這篇文章主要介紹了匯編語言XOR指令:對兩個操作數(shù)進(jìn)行邏輯(按位)異或操作,需要的朋友可以參考下2020-01-01UEFI開發(fā)實戰(zhàn)SlimBootloader中調(diào)用FSP
這篇文章主要為大家介紹了UEFI開發(fā)實戰(zhàn)SlimBootloader中調(diào)用FSP基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06