2.2 匯編語(yǔ)言:
匯編語(yǔ)言是一種功能很強(qiáng)的程序設(shè)計(jì)語(yǔ)言,也是利用計(jì)算機(jī)所有硬件特性并能直接控制硬件的語(yǔ)言。匯編語(yǔ)言,作為一門(mén)語(yǔ)匯編語(yǔ)言言,對(duì)應(yīng)于高級(jí)語(yǔ)言的編譯器,需要一個(gè)“匯編器”來(lái)把匯編語(yǔ)言原文件匯編成機(jī)器可執(zhí)行的代碼。高級(jí)的匯編器如MASM,TASM等等為我們寫(xiě)匯編程序提供了很多類似于高級(jí)語(yǔ)言的特征,比如結(jié)構(gòu)化、抽象等。在這樣的環(huán)境中編寫(xiě)的匯編程序,有很大一部分是面向匯編器的偽指令,已經(jīng)類同于高級(jí)語(yǔ)言。現(xiàn)在的匯編環(huán)境已經(jīng)如此高級(jí),即使全部用匯編語(yǔ)言來(lái)編寫(xiě)windows的應(yīng)用程序也是可行的,但這不是匯編語(yǔ)言的長(zhǎng)處。匯編語(yǔ)言的長(zhǎng)處在于編寫(xiě)高效且需要對(duì)機(jī)器硬件精確控制的程序。
匯編語(yǔ)言是為特定的計(jì)算機(jī)或者計(jì)算機(jī)系統(tǒng)設(shè)計(jì)的面向機(jī)器的語(yǔ)言。
匯編語(yǔ)言中的語(yǔ)句可以分成兩大類:
● 與機(jī)器指令相對(duì)應(yīng)的可執(zhí)行匯編語(yǔ)句;
● 匯編控制語(yǔ)句,即偽指令。
偽指令并不翻譯成機(jī)器指令,它的作用是控制匯編程序工作。
每條匯編語(yǔ)句被劃分成4個(gè)區(qū),依次是標(biāo)號(hào)區(qū)、操作碼區(qū)、操作數(shù)區(qū)和注解區(qū)。
例如:[標(biāo)號(hào)] [操作碼] [操作數(shù)] [注解]
用匯編語(yǔ)言編寫(xiě)的源程序,要通過(guò)匯編程序?qū)⑺g成機(jī)器語(yǔ)言程序,才能被計(jì)算機(jī)執(zhí)行。因此,匯編程序的功能就是將匯編語(yǔ)言所編寫(xiě)的源程序翻譯成由機(jī)器指令和其他信息組成的目標(biāo)程序。它的基本工作包括:
● 將每一條可執(zhí)行匯編語(yǔ)句轉(zhuǎn)換成對(duì)應(yīng)的機(jī)器指令;
● 處理源程序中出現(xiàn)的偽指令。
整個(gè)匯編程序工作通常要對(duì)源程序進(jìn)行兩次掃描才能完成。第一次掃描主要工作是定義符號(hào)的值。第二次掃描的目的則是產(chǎn)生目標(biāo)程序。其中,可執(zhí)行匯編語(yǔ)句被翻譯成對(duì)應(yīng)的二進(jìn)制代碼機(jī)器指令,而偽指令會(huì)根據(jù)偽指令記憶碼調(diào)用偽指令表對(duì)應(yīng)元素所規(guī)定的子程序入口。
大多數(shù)情況下Linux程序員不需要使用匯編語(yǔ)言,因?yàn)榧幢闶怯布?qū)動(dòng)這樣的底層程序在Linux操作系統(tǒng)中也可以完全用C語(yǔ)言來(lái)實(shí)現(xiàn),再加上GCC這一優(yōu)秀的編譯器目前已經(jīng)能夠?qū)ψ罱K生成的代碼進(jìn)行很好的優(yōu)化,的確有足夠的理由讓我們可以暫時(shí)將匯編語(yǔ)言拋在一邊了。但實(shí)際情況是Linux程序員有時(shí)還是需要使用匯編,或者不得不使用匯編,理由很簡(jiǎn)單:精簡(jiǎn)、高效和libc無(wú)關(guān)性。假設(shè)要移植Linux到某一特定的嵌入式硬件環(huán)境下,首先必然面臨如何減少系統(tǒng)大小、提高執(zhí)行效率等問(wèn)題,此時(shí)或許只有匯編語(yǔ)言能幫上忙了。
優(yōu)點(diǎn)
匯編語(yǔ)言直接同計(jì)算機(jī)的底層軟件甚至硬件進(jìn)行交互,它具有如下一些優(yōu)點(diǎn):
(1)能夠直接訪問(wèn)與硬件相關(guān)的存儲(chǔ)器或I/O端口;
(2)能夠不受編譯器的限制,對(duì)生成的二進(jìn)制代碼進(jìn)行完全的控制;
(3)能夠?qū)﹃P(guān)鍵代碼進(jìn)行更準(zhǔn)確的控制,避免因線程共同訪問(wèn)或者硬件設(shè)備共享引起的死鎖;
(4)能夠根據(jù)特定的應(yīng)用對(duì)代碼做最佳的優(yōu)化,提高運(yùn)行速度;
(5)能夠最大限度地發(fā)揮硬件的功能。
缺點(diǎn)
同時(shí)還應(yīng)該認(rèn)識(shí)到,匯編語(yǔ)言是一種層次非常低的語(yǔ)言,它僅僅高于直接手工編寫(xiě)二進(jìn)制的機(jī)器指令碼,因此不可避免地存在一些缺點(diǎn):
(1)編寫(xiě)的代碼非常難懂,不好維護(hù);
(2)很容易產(chǎn)生bug,難于調(diào)試;
(3)只能針對(duì)特定的體系結(jié)構(gòu)和處理器進(jìn)行優(yōu)化;
(4)開(kāi)發(fā)效率很低,時(shí)間長(zhǎng)且單調(diào)。
特點(diǎn)
匯編語(yǔ)言比機(jī)器語(yǔ)言易于讀寫(xiě)、調(diào)試和修改,同時(shí)具有機(jī)器語(yǔ)言全部?jī)?yōu)點(diǎn)。但在編寫(xiě)復(fù)雜程序時(shí),相對(duì)高級(jí)語(yǔ)言代碼量較大,而且匯編語(yǔ)言依賴于具體的處理器體系結(jié)構(gòu),不能通用,因此不能直接在不同處理器體系結(jié)構(gòu)之間移植。匯編語(yǔ)言的特點(diǎn):
1.面向機(jī)器的低級(jí)語(yǔ)言,通常是為特定的計(jì)算機(jī)或系列計(jì)算機(jī)專門(mén)設(shè)計(jì)的。
2.保持了機(jī)器語(yǔ)言的優(yōu)點(diǎn),具有直接和簡(jiǎn)捷的特點(diǎn)。
3.可有效地訪問(wèn)、控制計(jì)算機(jī)的各種硬件設(shè)備,如磁盤(pán)、存儲(chǔ)器、CPU、I/O端口等。
4.目標(biāo)代碼簡(jiǎn)短,占用內(nèi)存少,執(zhí)行速度快,是高效的程序設(shè)計(jì)語(yǔ)言。
5.經(jīng)常與高級(jí)語(yǔ)言配合使用,應(yīng)用十分廣泛。
對(duì)于不同型號(hào)的計(jì)算機(jī),有著不同的結(jié)構(gòu)的匯編語(yǔ)言。
匯編語(yǔ)言由于采用了助記符號(hào)來(lái)編寫(xiě)程序,比用機(jī)器語(yǔ)言的二進(jìn)制代碼編程要方便些,在一定程度上簡(jiǎn)化了編程過(guò)程。匯編語(yǔ)言的特點(diǎn)是用符號(hào)代替了機(jī)器指令代碼,而且助記符與指令代碼一一對(duì)應(yīng),基本保留了機(jī)器語(yǔ)言的靈活性。使用匯編語(yǔ)言能面向機(jī)器并較好地發(fā)揮機(jī)器的特性,得到質(zhì)量較高的程序。
匯編語(yǔ)言是面向具體機(jī)型的,它離不開(kāi)具體計(jì)算機(jī)的指令系統(tǒng),因此,對(duì)于不同型號(hào)的計(jì)算機(jī),有著不同的結(jié)構(gòu)的匯編語(yǔ)言,而且,對(duì)于同一問(wèn)題所編制的匯編語(yǔ)言程序在不同種類的計(jì)算機(jī)間是互不相通的。
匯編語(yǔ)言中由于使用了助記符號(hào),用匯編語(yǔ)言編制的程序輸入計(jì)算機(jī),計(jì)算機(jī)不能象用機(jī)器語(yǔ)言編寫(xiě)的程序一樣直接識(shí)別和執(zhí)行,必須通過(guò)預(yù)先放入計(jì)算機(jī)的“匯編程序”中進(jìn)行加工和翻譯,才能變成能夠被計(jì)算機(jī)直接識(shí)別和處理的二進(jìn)制代碼程序。用匯編語(yǔ)言等非機(jī)器語(yǔ)言書(shū)寫(xiě)好的符號(hào)程序稱為源程序,運(yùn)行時(shí)匯編程序要將源程序翻譯成目標(biāo)程序。目標(biāo)程序是機(jī)器語(yǔ)言程序,當(dāng)它被安置在內(nèi)存的預(yù)定位置上,就能被計(jì)算機(jī)的CPU處理和執(zhí)行。
匯編語(yǔ)言像機(jī)器指令一樣,是硬件操作的控制信息,因而仍然是面向機(jī)器的語(yǔ)言,使用起來(lái)還是比較繁瑣費(fèi)時(shí),通用性也差。但是,匯編語(yǔ)言用來(lái)編制系統(tǒng)軟件和過(guò)程控制軟件,其目標(biāo)程序占用內(nèi)存空間少,運(yùn)行速度快,有著高級(jí)語(yǔ)言不可替代的用途。
應(yīng)用
匯編語(yǔ)言作為最基本的編程語(yǔ)言之一,匯編語(yǔ)言雖然應(yīng)用的范圍不算很廣,但重要性卻勿庸置疑,因?yàn)樗軌蛲瓿稍S多其它匯編語(yǔ)言程序設(shè)計(jì)語(yǔ)言所無(wú)法完成的功能。就拿Linux內(nèi)核來(lái)講,雖然絕大部分代碼是用C語(yǔ)言編寫(xiě)的,但仍然不可避免地在某些關(guān)鍵地方使用了匯編代碼,其中主要是在Linux的啟動(dòng)部分。由于這部分代碼與硬件的關(guān)系非常密切,即使是C語(yǔ)言也會(huì)有些力不從心,而匯編語(yǔ)言則能夠很好揚(yáng)長(zhǎng)避短,最大限度地發(fā)揮硬件的性能。
1.70%以上的系統(tǒng)軟件是用匯編語(yǔ)言編寫(xiě)的。
2.某些快速處理、位處理、訪問(wèn)硬件設(shè)備等高效程序是用匯編語(yǔ)言編寫(xiě)的。
3.某些高級(jí)繪圖程序、視頻游戲程序是用匯編語(yǔ)言編寫(xiě)的。
匯編語(yǔ)言是理解整個(gè)計(jì)算機(jī)系統(tǒng)的最佳起點(diǎn)和最有效途徑,人們經(jīng)常認(rèn)為匯編語(yǔ)言的應(yīng)用范圍很小,而忽視它的重要性。其實(shí)匯編語(yǔ)言對(duì)每一個(gè)希望學(xué)習(xí)計(jì)算機(jī)科學(xué)與技術(shù)的人來(lái)說(shuō)都是非常重要的,是不能不學(xué)習(xí)的語(yǔ)言。所有可編程計(jì)算機(jī)都向人們提供機(jī)器指令,通過(guò)機(jī)器指令人們能夠使用機(jī)器的邏輯功能。所有程序,不論用何種語(yǔ)言編制,都必須轉(zhuǎn)成機(jī)器指令,運(yùn)用機(jī)器的邏輯功能,其功能才能得以實(shí)現(xiàn)。機(jī)器的邏輯功能,軟件系統(tǒng)功能構(gòu)筑其上,硬件系統(tǒng)功能運(yùn)行于下。匯編語(yǔ)言直接描述機(jī)器指令,比機(jī)器指令容易記憶和理解。通過(guò)學(xué)習(xí)和使用匯編語(yǔ)言,能夠感知、體會(huì)、理解機(jī)器的邏輯功能,向上為理解各種軟件系統(tǒng)的原理,打下技術(shù)理論基礎(chǔ);向下為掌握硬件系統(tǒng)的原理,打下實(shí)踐應(yīng)用基礎(chǔ)。學(xué)習(xí)匯編語(yǔ)言,向上可以理解軟件,向下能夠感知硬件,是我們理解整個(gè)計(jì)算機(jī)系統(tǒng)的最佳起點(diǎn)。
相關(guān)推薦:
2012年軟考系統(tǒng)分析師考試60天完美復(fù)習(xí)計(jì)劃
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |