匯編語(yǔ)言(Assembly Language)是任何一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱(chēng)為符號(hào)語(yǔ)言。在匯編語(yǔ)言中,用助記符代替機(jī)器指令的操作碼,用地址符號(hào)或標(biāo)號(hào)代替指令或操作數(shù)的地址。在不同的設(shè)備中,匯編語(yǔ)言對(duì)應(yīng)著不同的機(jī)器語(yǔ)言指令集,通過(guò)匯編過(guò)程轉(zhuǎn)換成機(jī)器指令。特定的匯編語(yǔ)言和特定的機(jī)器語(yǔ)言指令集是一一對(duì)應(yīng)的,不同平臺(tái)之間不可直接移植。
匯編語(yǔ)言,即第二代計(jì)算機(jī)語(yǔ)言,用一些容易理解和記憶的縮寫(xiě)單詞來(lái)代替一些特定的指令,例如:用"ADD"代表加法操作指令,"SUB"代表減法操作指令,以及"INC"代表增加1,"DEC"代表減去1,"MOV"代表變量傳遞等等,通過(guò)這種方法,人們很容易去閱讀已經(jīng)完成的程序或者理解程序正在執(zhí)行的功能,對(duì)現(xiàn)有程序的bug修復(fù)以及運(yùn)營(yíng)維護(hù)都變得更加簡(jiǎn)單方便。但計(jì)算機(jī)的硬件不認(rèn)識(shí)字母符號(hào),這時(shí)候就需要一個(gè)專(zhuān)門(mén)的程序把這些字符變成計(jì)算機(jī)能夠識(shí)別的二進(jìn)制數(shù)或機(jī)器語(yǔ)言。因?yàn)閰R編語(yǔ)言只是將機(jī)器語(yǔ)言做了簡(jiǎn)單編譯,所以并沒(méi)有根本上解決機(jī)器語(yǔ)言的特定性,所以匯編語(yǔ)言和機(jī)器自身的編程環(huán)境息息相關(guān),推廣和移植很難,但是還是保持了機(jī)器語(yǔ)言?xún)?yōu)秀的執(zhí)行效率,因?yàn)樗目砷喿x性和簡(jiǎn)便性,匯編語(yǔ)言到現(xiàn)在依然是常用的編程語(yǔ)言之一。匯編語(yǔ)言不像其他大多數(shù)的程序設(shè)計(jì)語(yǔ)言一樣被廣泛用于程序設(shè)計(jì)。在今天的實(shí)際應(yīng)用中,它通常被應(yīng)用在底層,硬件操作和高要求的程序優(yōu)化的場(chǎng)合。驅(qū)動(dòng)程序、嵌入式操作系統(tǒng)和實(shí)時(shí)運(yùn)行程序都需要匯編語(yǔ)言。
自從1946年世界上第一臺(tái)電子計(jì)算機(jī)問(wèn)世,人類(lèi)和機(jī)器的交流方式和語(yǔ)言就成為了軟件工程師和計(jì)算機(jī)從業(yè)者的主要研究方向,更有效更簡(jiǎn)便的編程語(yǔ)言成為了軟件工程師的新寵兒,伴隨著計(jì)算機(jī)的飛速發(fā)展,計(jì)算機(jī)的硬件升級(jí)速度也越來(lái)越快,對(duì)編程語(yǔ)言的要求也日益嚴(yán)格。在過(guò)去的幾十年,編程語(yǔ)言有了長(zhǎng)足的發(fā)展,至今已經(jīng)有四代語(yǔ)言問(wèn)世。大量的編程語(yǔ)言為了滿足不同領(lǐng)域的編程要求和軟件功能,經(jīng)歷了被修改,被取代,被發(fā)展等過(guò)程,最終發(fā)展成了現(xiàn)在編程語(yǔ)言的多樣化。盡管人們多次試圖尋找一個(gè)能夠適應(yīng)所有編程環(huán)境的通用語(yǔ)言,但是卻沒(méi)有一次成功。程序設(shè)計(jì)語(yǔ)言正在與現(xiàn)代科技日益飛躍,人類(lèi)的智慧在日益彰顯。
計(jì)算機(jī)的硬件作為一種電路元件,它的輸出和輸入只能是有電或者沒(méi)電,也就是所說(shuō)的高電平和低電平,所以計(jì)算機(jī)傳遞的數(shù)據(jù)是由“0”和“1”組成的二進(jìn)制數(shù),所以說(shuō)二進(jìn)制的語(yǔ)言是計(jì)算機(jī)語(yǔ)言的本質(zhì)。計(jì)算機(jī)發(fā)明之初,人們?yōu)榱巳タ刂朴?jì)算機(jī)完成自己的任務(wù)或者項(xiàng)目,只能去編寫(xiě)“0”、“1”這樣的二進(jìn)制數(shù)字串去控制電腦,其實(shí)就是控制計(jì)算機(jī)硬件的高低電平或通路開(kāi)路,這種語(yǔ)言就是機(jī)器語(yǔ)言。直觀上看,機(jī)器語(yǔ)言十分晦澀難懂,其中的含義往往要通過(guò)查表或者手冊(cè)才能理解,使用的時(shí)候非常痛苦,尤其當(dāng)你需要修改已經(jīng)完成的程序時(shí),這種看起來(lái)無(wú)序的機(jī)器語(yǔ)言會(huì)讓你無(wú)從下手,也很難找到程序的錯(cuò)誤。而且,不同計(jì)算機(jī)的運(yùn)行環(huán)境不同,指令方式操作方式也不盡相同,所以當(dāng)你在這種機(jī)器語(yǔ)言就有了特定性,只能在特定的計(jì)算機(jī)上執(zhí)行,而一旦換了機(jī)器就需要重新編程,這極大的降低了程序的使用和推廣效率。但由于機(jī)器語(yǔ)言具有特定性,完美適配特定型號(hào)的計(jì)算機(jī),故而運(yùn)行效率遠(yuǎn)遠(yuǎn)高過(guò)其他語(yǔ)言。機(jī)器語(yǔ)言,也就是第一代編程語(yǔ)言。
不難看出機(jī)器語(yǔ)言作為一種編程語(yǔ)言,靈活性較差可閱讀性也很差,為了減輕機(jī)器語(yǔ)言帶給軟件工程師的不適應(yīng),人們對(duì)機(jī)器語(yǔ)言進(jìn)行了升級(jí)和改進(jìn):用一些容易理解和記憶的字母,單詞來(lái)代替一個(gè)特定的指令。通過(guò)這種方法,人們很容易去閱讀已經(jīng)完成的程序或者理解程序正在執(zhí)行的功能,對(duì)現(xiàn)有程序的bug修復(fù)以及運(yùn)營(yíng)維護(hù)都變得更加簡(jiǎn)單方便,這種語(yǔ)言就是我們所說(shuō)的匯編語(yǔ)言,即第二代計(jì)算機(jī)語(yǔ)言。
比起機(jī)器語(yǔ)言,匯編語(yǔ)言具有更高的機(jī)器相關(guān)性,更加便于記憶和書(shū)寫(xiě),但又同時(shí)保留了機(jī)器語(yǔ)言高速度和高效率的特點(diǎn)。匯編語(yǔ)言仍是面向機(jī)器的語(yǔ)言,很難從其代碼上理解程序設(shè)計(jì)意圖,設(shè)計(jì)出來(lái)的程序不易被移植,故不像其他大多數(shù)的高級(jí)計(jì)算機(jī)語(yǔ)言一樣被廣泛應(yīng)用。所以在高級(jí)語(yǔ)言高度發(fā)展的今天,它通常被用在底層,通常是程序優(yōu)化或硬件操作的場(chǎng)合。
在編程語(yǔ)言經(jīng)歷了機(jī)器語(yǔ)言,匯編語(yǔ)言等更新之后,人們發(fā)現(xiàn)了限制程序推廣的關(guān)鍵因素——程序的可移植性。需要設(shè)計(jì)一個(gè)能夠不依賴(lài)于計(jì)算機(jī)硬件,能夠在不同機(jī)器上運(yùn)行的程序。這樣可以免去很多編程的重復(fù)過(guò)程,提高效率,同時(shí)這種語(yǔ)言又要接近于數(shù)學(xué)語(yǔ)言或人的自然語(yǔ)言。在計(jì)算機(jī)還很稀缺的50年代,誕生了第一個(gè)高級(jí)編程語(yǔ)言。當(dāng)時(shí)計(jì)算機(jī)的造價(jià)不菲,但是每天的計(jì)算量又有限,如何有效的利用計(jì)算機(jī)有限的計(jì)算能力成為了當(dāng)時(shí)人們面對(duì)的問(wèn)題。同時(shí),因?yàn)橘Y源的稀缺,計(jì)算機(jī)的運(yùn)行效率也成為了那個(gè)年代工程師追尋的目標(biāo)。為了更高效的使用計(jì)算機(jī),人們?cè)O(shè)計(jì)出了高級(jí)編程語(yǔ)言,來(lái)滿足人們對(duì)于高效簡(jiǎn)潔的編程語(yǔ)言的追求。
由于匯編指令系統(tǒng)龐大,因而需構(gòu)建指令系統(tǒng)體系,其指令數(shù)量龐大,格式復(fù)雜,可記憶性差等。指令中最難的是指令所支持的尋址方式,其實(shí)質(zhì)就是指令中操作數(shù)如何獲取。對(duì)于處理器而言,就是如何找到他所需的數(shù)據(jù)。但對(duì)于計(jì)算機(jī)底層的匯編語(yǔ)言而言,這種尋址方式將涉及大量的計(jì)算存儲(chǔ)格式,與復(fù)雜的存儲(chǔ)管理方式緊密相關(guān),因而難以理解。最后,匯編指令還關(guān)系到如何影響標(biāo)志位,但處理器標(biāo)志位非常復(fù)雜,因而對(duì)其機(jī)制掌握就比較困難。
包括通用數(shù)據(jù)傳送指令MOV、條件傳送指令CMOVcc、堆棧操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交換指令XCHG/XLAT/BSWAP、地址或段描述符選擇子傳送指令LEA/LDS/LES/LFS/LGS/LSS等。
這部分指令用于執(zhí)行算術(shù)和邏輯運(yùn)算,包括加法指令A(yù)DD/ADC、減法指令SUB/SBB、加一指令I(lǐng)NC、減一指令DEC、比較操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符號(hào)擴(kuò)展指令CBW/CWDE/CDQE、十進(jìn)制調(diào)整指令DAA/DAS/AAA/AAS、邏輯運(yùn)算指令NOT/AND/OR/XOR/TEST等。
這部分指令用于將寄存器或內(nèi)存操作數(shù)移動(dòng)指定的次數(shù)。包括邏輯左移指令SHL、邏輯右移指令SHR、算術(shù)左移指令SAL、算術(shù)右移指令SAR、循環(huán)左移指令ROL、循環(huán)右移指令ROR等。
這部分指令包括位測(cè)試指令BT、位測(cè)試并置位指令BTS、位測(cè)試并復(fù)位指令BTR、位測(cè)試并取反指令BTC、位向前掃描指令BSF、位向后掃描指令BSR等。
這部分包括無(wú)條件轉(zhuǎn)移指令JMP、條件轉(zhuǎn)移指令JCC/JCXZ、循環(huán)指令LOOP/LOOPE/LOOPNE、過(guò)程調(diào)用指令CALL、子過(guò)程返回指令RET、中斷指令I(lǐng)NTn、INT3、INTO、IRET等。
這部分指令用于對(duì)數(shù)據(jù)串進(jìn)行操作,包括串傳送指令MOVS、串比較指令CMPS、串掃描指令SCANS、串加載指令LODS、串保存指令STOS,這些指令可以有選擇地使用REP/REPE/REPZ/REPNE和REPNZ的前綴以連續(xù)操作。
這部分指令用于同外圍設(shè)備交換數(shù)據(jù),包括端口輸入指令I(lǐng)N/INS、端口輸出指令OUT/OUTS。
匯編語(yǔ)言是計(jì)算機(jī)提供給用戶(hù)的最快最有效的語(yǔ)言,也是能夠利用計(jì)算機(jī)的所有硬件特性并能夠直接控制硬件的唯一語(yǔ)言。但是由于編寫(xiě)和調(diào)試匯編語(yǔ)言程序要比高級(jí)語(yǔ)言復(fù)雜,因此目前其應(yīng)用不如高級(jí)語(yǔ)言廣泛。
匯編語(yǔ)言比機(jī)器語(yǔ)言的可讀性要好,但跟高級(jí)語(yǔ)言比較而言,可讀性還是較差。不過(guò)采用它編寫(xiě)的程序具有存儲(chǔ)空間占用少、執(zhí)行速度快的特點(diǎn),這些是高級(jí)語(yǔ)言所無(wú)法取代的。在實(shí)際應(yīng)用中,是否使用匯編語(yǔ)言,取決于具體應(yīng)用要求、開(kāi)發(fā)時(shí)間和質(zhì)量等方面作權(quán)衡。
匯編語(yǔ)言作為機(jī)器語(yǔ)言之上的第二代編程語(yǔ)言,它也有很多優(yōu)點(diǎn):
可以輕松的讀取存儲(chǔ)器狀態(tài)以及硬件I/O接口情況
編寫(xiě)的代碼因?yàn)樯倭撕芏嗑幾g的環(huán)節(jié),可以能夠準(zhǔn)確的被執(zhí)行
作為一種低級(jí)語(yǔ)言,可擴(kuò)展性很高
因?yàn)榇a非常單調(diào),特殊指令字符很少,所以造成了代碼的冗長(zhǎng)以及編寫(xiě)的困難
因?yàn)閰R編仍然需要自己去調(diào)用存儲(chǔ)器存儲(chǔ)數(shù)據(jù),很容易出現(xiàn)BUG,而且調(diào)試起來(lái)也不容易
就算完成了一個(gè)程序,后期維護(hù)時(shí)候也需要耗費(fèi)大量的時(shí)間。
因?yàn)闄C(jī)器的特殊性造成了代碼兼容性差的缺陷。
匯編語(yǔ)言的特點(diǎn)是容易被計(jì)算機(jī)識(shí)別和執(zhí)行,使用它進(jìn)行編程可以減少占用空間、提高運(yùn)行速度,并能直接對(duì)硬件實(shí)施控制。在需要實(shí)時(shí)控制的時(shí)候,有著不可替代的重要地位,但匯編語(yǔ)言在編程和理解時(shí)要復(fù)雜、困難一些,尤其是在進(jìn)行數(shù)據(jù)處理或是邏輯運(yùn)算時(shí)更加凸顯出其劣勢(shì)。
高級(jí)語(yǔ)言是面向使用者的語(yǔ)言,能更準(zhǔn)確地被程序員所理解,它的表達(dá)能力強(qiáng),功能多,編程效率高,上手速度快,自動(dòng)化程度高,因而更受歡迎。在大部分軟件開(kāi)發(fā)中,使用者都采用高級(jí)語(yǔ)言編程,以提高編程效率。但在要求存儲(chǔ)空間小,執(zhí)行速度快,需直接對(duì)硬件進(jìn)行控制的場(chǎng)合,則應(yīng)用匯編語(yǔ)言編程,以達(dá)到優(yōu)化程序速度的目的。
這樣兩種看似差別很大的語(yǔ)言,它們之間又有著緊密的聯(lián)系。在一些程序設(shè)計(jì)當(dāng)中,如果把兩者結(jié)合起來(lái)使用,將兩種語(yǔ)言的優(yōu)勢(shì)同時(shí)發(fā)揮出來(lái),則可以解決很多特性難題。在許多程序的設(shè)計(jì)當(dāng)中,高級(jí)語(yǔ)言和匯編語(yǔ)言可以相互交叉調(diào)用,進(jìn)行參數(shù)傳遞,共享數(shù)據(jù)信息,這便是所謂的混合編程。程序員往往在高級(jí)語(yǔ)言程序中直接嵌入?yún)R編語(yǔ)句,以實(shí)現(xiàn)對(duì)硬件直接進(jìn)行控制的功能,這是混合編程中常見(jiàn)的做法。也可以在高級(jí)語(yǔ)言程序中使用匯編語(yǔ)言中定義的變量和常量,或使用內(nèi)部函數(shù)對(duì)匯編語(yǔ)句進(jìn)行調(diào)用。簡(jiǎn)而言之,這類(lèi)混合編程的方法可以讓高級(jí)語(yǔ)言與匯編語(yǔ)言互相取長(zhǎng)補(bǔ)短,各自發(fā)揮各自?xún)?yōu)勢(shì),同時(shí)減少各自缺點(diǎn)所帶來(lái)的不便,善用這個(gè)方法可以使開(kāi)發(fā)和編程工作達(dá)到事半功倍的效果。
典型的現(xiàn)代匯編器(Assembler)建造目標(biāo)代碼,由解譯組語(yǔ)指令集的易記碼(Mnemonics)到操作碼(OpCode),并解析符號(hào)名稱(chēng)(Symbolic Names)成為存儲(chǔ)器地址以及其它的實(shí)體。使用符號(hào)參考是匯編器的一個(gè)重要特征,它可以節(jié)省修改程序后人工轉(zhuǎn)址的乏味耗時(shí)計(jì)算。基本就是把機(jī)器碼變成一些字母而已,編譯的時(shí)候再把輸入的指令字母替換成為晦澀難懂機(jī)器碼。
用匯編語(yǔ)言等非機(jī)器語(yǔ)言書(shū)寫(xiě)好的符號(hào)程序稱(chēng)為源程序,匯編語(yǔ)言編譯器的作用是將源程序翻譯成目標(biāo)程序。目標(biāo)程序是機(jī)器語(yǔ)言程序,當(dāng)它被安置在內(nèi)存的預(yù)定位置上后,就能被計(jì)算機(jī)的CPU處理和執(zhí)行。
匯編的調(diào)試環(huán)境總的來(lái)說(shuō)比較少,也很少有非常好的編譯器。編譯器的選擇依賴(lài)于目標(biāo)處理器的類(lèi)型和具體的系統(tǒng)平臺(tái)。一般來(lái)說(shuō),功能良好的編譯器用起來(lái)應(yīng)當(dāng)非常方便,比如,應(yīng)當(dāng)可以自動(dòng)整理格式、語(yǔ)法高亮顯示,集編譯、鏈接和調(diào)試為一體,方便實(shí)用。
對(duì)于廣泛使用的個(gè)人計(jì)算機(jī)來(lái)說(shuō),可以自由選擇的匯編語(yǔ)言編譯器有MASM、NASM、TASM、GAS、FASM、RADASM等,但大都不具備調(diào)試功能。如果是為了學(xué)習(xí)匯編語(yǔ)言,輕松匯編因?yàn)閾碛幸粋€(gè)完善的集成環(huán)境,是一款非常適合初學(xué)者的匯編編譯器。
隨著現(xiàn)代軟件系統(tǒng)越來(lái)越龐大復(fù)雜,大量經(jīng)過(guò)了封裝的高級(jí)語(yǔ)言如C/C++,Pascal/Object Pascal也應(yīng)運(yùn)而生。這些新的語(yǔ)言使得程序員在開(kāi)發(fā)過(guò)程中能夠更簡(jiǎn)單,更有效率,使軟件開(kāi)發(fā)人員得以應(yīng)付快速的軟件開(kāi)發(fā)的要求。而匯編語(yǔ)言由于其復(fù)雜性使得其適用領(lǐng)域逐步減小。但這并不意味著匯編已無(wú)用武之地。由于匯編更接近機(jī)器語(yǔ)言,能夠直接對(duì)硬件進(jìn)行操作,生成的程序與其他的語(yǔ)言相比具有更高的運(yùn)行速度,占用更小的內(nèi)存,因此在一些對(duì)于時(shí)效性要求很高的程序、許多大型程序的核心模塊以及工業(yè)控制方面大量應(yīng)用。
雖然隨著半導(dǎo)體技術(shù)、編程技術(shù)的不斷發(fā)展,在實(shí)際工程應(yīng)用中確實(shí)很少看到匯編語(yǔ)言的身影,但這并不能說(shuō)明匯編語(yǔ)言沒(méi)用,已被其他高級(jí)語(yǔ)言所取代。嵌入式系統(tǒng)的底層驅(qū)動(dòng)、計(jì)算機(jī)的BIOS還是要用匯編語(yǔ)言實(shí)現(xiàn)。匯編語(yǔ)言是培養(yǎng)學(xué)生理解硬件資源的語(yǔ)言,是學(xué)習(xí)和理解其他高級(jí)程序設(shè)計(jì)語(yǔ)言的基礎(chǔ),是計(jì)算機(jī)組成原理、接口與通信技術(shù)、計(jì)算機(jī)控制技術(shù)和數(shù)據(jù)采集等許多專(zhuān)業(yè)課的前導(dǎo)課程,是必要的基礎(chǔ)知識(shí),起著承上啟下的作用。