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