複製鏈接
請複製以下鏈接發送給好友

彙編語言

(面向機器的程序設計語言)

鎖定
彙編語言(Assembly Language)是任何一種用於電子計算機微處理器微控制器或其他可編程器件的低級語言,亦稱為符號語言。在彙編語言中,用助記符代替機器指令操作碼,用地址符號或標號代替指令或操作數的地址。在不同的設備中,彙編語言對應着不同的機器語言指令集,通過彙編過程轉換成機器指令。特定的彙編語言和特定的機器語言指令集是一一對應的,不同平台之間不可直接移植。 [1] 
中文名
彙編語言
外文名
Assembly Language
學    科
軟件工程
產生年代
20世紀50年代
編譯方式
彙編
擴展名
.asm

彙編語言簡介

彙編語言, 即第二代計算機語言,用一些容易理解和記憶的縮寫單詞來代替一些特定的指令,例如:用"ADD"代表加法操作指令,"SUB"代表減法操作指令,以及"INC"代表增加1,"DEC"代表減去1,"MOV"代表變量傳遞等等,通過這種方法,人們很容易去閲讀已經完成的程序或者理解程序正在執行的功能,對現有程序的bug修復以及運營維護都變得更加簡單方便。但計算機的硬件不認識字母符號,這時候就需要一個專門的程序把這些字符變成計算機能夠識別的二進制數機器語言。因為彙編語言只是將機器語言做了簡單編譯,所以並沒有根本上解決機器語言的特定性,所以彙編語言和機器自身的編程環境息息相關,推廣和移植很難,但是還是保持了機器語言優秀的執行效率,因為他的可閲讀性和簡便性,彙編語言到現在依然是常用的編程語言之一。 [2]  彙編語言不像其他大多數的程序設計語言一樣被廣泛用於程序設計。在今天的實際應用中,它通常被應用在底層,硬件操作和高要求的程序優化的場合。驅動程序、嵌入式操作系統和實時運行程序都需要彙編語言。 [1] 

彙編語言發展歷程

彙編語言編程語言

自從1946年世界上第一台電子計算機問世,人類和機器的交流方式和語言就成為了軟件工程師和計算機從業者的主要研究方向,更有效更簡便的編程語言成為了軟件工程師的新寵兒,伴隨着計算機的飛速發展,計算機的硬件升級速度也越來越快,對編程語言的要求也日益嚴格。在過去的幾十年,編程語言有了長足的發展,至今已經有四代語言問世。大量的編程語言為了滿足不同領域的編程要求和軟件功能,經歷 了被修改,被取代,被髮展等過程,最終發展成了現在編程語言的多樣化。儘管人們多次試圖尋找一個能夠適應所有編程環境的通用語言,但 是卻沒有一次成功。程序設計語言正在與現代科技日益飛躍,人類的智慧在日益彰顯。 [2] 

彙編語言機器語言

計算機的硬件作為一種電路元件,它的輸出和輸入只能是有電或者沒電,也就是所説的高電平低電平,所以計算機傳遞的數據是由“0” 和“1”組成的二進制數,所以説二進制的語言是計算機語言的本質。計算機發明之初,人們為了去控制計算機完成自己的任務或者項目,只能去編寫“0”、“ 1”這樣的二進制數字串去控制電腦,其實就是控制計算機硬件的高低電平或通路開路,這種語言就是機器語言。直觀上看,機器語言十分晦澀難懂,其中的含義往往要通過查表或者手冊才能理解, 使用的時候非常痛苦,尤其當你需要修改已經完成的程序時,這種看起來無序的機器語言會讓你無從下手,也很難找到程序的錯誤。而且,不同計算機的運行環境不同,指令方式操作方式也不盡相同,所以當你在這種機器語言就有了特定性,只能在特定的計算機上執行,而一旦換了機器就需要重新編程,這極大的降低了程序的使用和推廣效率。但由於機器語言具有特定性,完美適配特定型號的計算機,故而運行效率遠遠高過其他語言。機器語言,也就是第一代編程語言。 [2] 

彙編語言彙編語言

不難看出機器語言作為一種編程語言, 靈活性較差可閲讀性也很差,為了減輕機器語言帶給軟件工程師的不適應,人們對機器語言進行了升級和改進:用一些容易理解和記憶的字母,單詞來代替一個特定的指令。通過這種方法,人們很容易去閲讀 已經完成的程序或者理解程序正在執行的功能,對現有程序的bug修復以及運營維護都變得更加簡單方便,這種語言就是我們所説的彙編語言, 即第二代計算機語言。 [2] 
比起機器語言,彙編語言具有更高的機器相關性,更加便於記憶和書寫,但又同時保留了機器語言高速度和高效率的特點。彙編語言仍是面向機器的語言,很難從其代碼上理解程序設計意圖,設計出來的程序不易被移植,故不像其他大多數的高級計算機語言一樣被廣泛應用。所以在高級語言高度發展的今天,它通常被用在底層,通常是程序優化或硬件操作的場合。 [3] 

彙編語言高級語言

在編程語言經歷了機器語言,彙編語言等更新之後,人們發現了限制程序推廣的關鍵因素——程序的可移植性。需要設計一個能夠不依賴於計算機硬件,能夠在不同機器上運行的程序。這樣可以免去很多編程的重複過程,提高效率,同時這種語言又要接近於數學語言或人的自然語言。在計算機還很稀缺的50年代,誕生了第一個高級編程語言。當時計算機的造價不菲,但是每天的計算量又有限,如何有效的利用計算機有限的計算能力成為了當時人們面對的問題。同時,因為資源的稀缺, 計算機的運行效率也成為了那個年代工程師追尋的目標。為了更高效的使用計算機,人們設計出了高級編程語言,來滿足人們對於高效簡潔的編程語言的追求。 [2] 

彙編語言語言組成

由於彙編指令系統龐大,因而需構建指令系統體系,其指令數量龐大,格式複雜,可記憶性差等。指令中最難的是指令所支持的尋址方式,其實質就是指令中操作數如何獲取。對於處理器而言,就是如何找到他所需的數據。但對於計算機底層的彙編語言而言,這種尋址方式將涉及大量的計算存儲格式,與 複雜的存儲管理方式緊密相關,因而難以理解。最後,彙編指令還關係到如何影響標誌位,但處理器標誌位非常複雜,因而對其機制掌握就比較困難。 [4] 

彙編語言傳送指令

包括通用數據傳送指令MOV、條件傳送指令CMOVcc、堆棧操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交換指令XCHG/XLAT/BSWAP、地址或段描述符選擇子傳送指令LEA/LDS/LES/LFS/LGS/LSS等。 [1] 

彙編語言邏輯運算

這部分指令用於執行算術和邏輯運算,包括加法指令ADD/ADC、減法指令SUB/SBB、加一指令INC、減一指令DEC、比較操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符號擴展指令CBW/CWDE/CDQE、十進制調整指令DAA/DAS/AAA/AAS邏輯運算指令NOT/AND/OR/XOR/TEST等。 [1] 

彙編語言移位指令

這部分指令用於將寄存器或內存操作數移動指定的次數。包括邏輯左移指令SHL、邏輯右移指令SHR、算術左移指令SAL算術右移指令SAR、循環左移指令ROL、循環右移指令ROR等。 [1] 

彙編語言位操作

這部分指令包括位測試指令BT、位測試並置位指令BTS、位測試並復位指令BTR、位測試並取反指令BTC、位向前掃描指令BSF、位向後掃描指令BSR等。 [1] 

彙編語言控制轉移

這部分包括無條件轉移指令JMP、條件轉移指令JCC/JCXZ、循環指令LOOP/LOOPE/LOOPNE、過程調用指令CALL、子過程返回指令RET中斷指令INTn、INT3、INTO、IRET等。 [1] 

彙編語言串操作

這部分指令用於對數據串進行操作,包括串傳送指令MOVS、串比較指令CMPS、串掃描指令SCANS、串加載指令LODS、串保存指令STOS,這些指令可以有選擇地使用REP/REPE/REPZ/REPNE和REPNZ的前綴以連續操作 [1] 

彙編語言輸入輸出

這部分指令用於同外圍設備交換數據,包括端口輸入指令IN/INS、端口輸出指令OUT/OUTS。 [1] 

彙編語言語言特點

彙編語言是計算機提供給用户的最快最有效的語言,也是能夠利用計算機的所有硬件特性並能夠直接控制硬件的唯一語言。但是由於編寫和調試彙編語言程序要比高級語言複雜,因此目前其應用不如高級語言廣泛。
彙編語言比機器語言的可讀性要好,但跟高級語言比較而言,可讀性還是較差。不過採用它編寫的程序具有存儲空間佔用少、執行速度快的特點,這些是高級語言所無法取代的。在實際應用中,是否使用匯編語言,取決於具體應用要求、開發時間和質量等方面作權衡。 [2] 

彙編語言優點

彙編語言作為機器語言之上的第二代編程語言,它也有很多優點:
  1. 可以輕鬆的讀取存儲器狀態以及硬件I/O接口情況
  2. 編寫的代碼因為少了很多編譯的環節,可以能夠準確的被執行
  3. 作為一種低級語言,可擴展性很高 [2] 

彙編語言缺點

  1. 因為代碼非常單調,特殊指令字符很少,所以造成了代碼的冗長以及編寫的困難
  2. 因為彙編仍然需要自己去調用存儲器存儲數據,很容易出現BUG,而且調試起來也不容易
  3. 就算完成了一個程序,後期維護時候也需要耗費大量的時間。
  4. 因為機器的特殊性造成了代碼兼容性差的缺陷。 [2] 

彙編語言對比高級語言

彙編語言區別

彙編語言的特點是容易被計算機識別和執行,使用它進行編程可以減少佔用空間、提高運行速度,並能直接對硬件實施控制。在需要實時控制的時候,有着不可替代的重要地位,但彙編語言在編程和理解時要複雜、困難一些,尤其是在進行數據處理或是邏輯運算時更加凸顯出其劣勢。
高級語言是面向使用者的語言,能更準確地被程序員所理解,它的表達能力強,功能多,編程效率高,上手速度快, 自動化程度高,因而更受歡迎。在大部分軟件開發中,使用者都採用高級語言編程,以提高編程效率。但在要求存儲空間小,執行速度快,需直接對硬件進行控制的場合,則應用匯編語言編程,以達到優化程序速度的目的。 [3] 

彙編語言聯繫

這樣兩種看似差別很大的語言,它們之間又有着緊密的聯繫。在一些程序設計當中,如果把兩者結合起來使用,將兩種語言的優勢同時發揮出來,則可以解決很多特性難題。 在許多程序的設計當中,高級語言和彙編語言可以相互交叉調用,進行參數傳遞共享數據信息,這便是所謂的混合編程。程序員往往在高級語言程序中直接嵌入彙編語句,以實現對硬件直接進行控制的功能,這是混合編程中常見的做法。也可以在高級語言程序中使用匯編語言中定義的變量和常量,或使用內部函數對彙編語句進行調用。 簡而言之,這類混合編程的方法可以讓高級語言與彙編語言互相取長補短,各自發揮各自優勢,同時減少各自缺點所帶來的不便,善用這個方法可以使開發和編程工作達到事半功倍的效果。 [3] 

彙編語言相關技術

彙編語言彙編器

典型的現代彙編器Assembler)建造目標代碼,由解譯組語指令集的易記碼(Mnemonics)到操作碼(OpCode),並解析符號名稱(Symbolic Names)成為存儲器地址以及其它的實體。使用符號參考是彙編器的一個重要特徵,它可以節省修改程序後人工轉址的乏味耗時計算。基本就是把機器碼變成一些字母而已,編譯的時候再把輸入的指令字母替換成為晦澀難懂機器碼。 [1] 

彙編語言編譯環境

用匯編語言等非機器語言書寫好的符號程序稱為源程序彙編語言編譯器的作用是將源程序翻譯成目標程序。目標程序是機器語言程序,當它被安置在內存的預定位置上後,就能被計算機的CPU處理和執行。 [1] 
彙編的調試環境總的來説比較少,也很少有非常好的編譯器。編譯器的選擇依賴於目標處理器的類型和具體的系統平台。一般來説,功能良好的編譯器用起來應當非常方便,比如,應當可以自動整理格式、語法高亮顯示,集編譯、鏈接和調試為一體,方便實用。 [1] 
對於廣泛使用的個人計算機來説,可以自由選擇的彙編語言編譯器有MASMNASMTASMGAS、FASM、RADASM等,但大都不具備調試功能。如果是為了學習彙編語言,輕鬆彙編因為擁有一個完善的集成環境,是一款非常適合初學者的彙編編譯器 [1] 

彙編語言發展前景

隨着現代軟件系統越來越龐大複雜,大量經過了封裝的高級語言如C/C++,Pascal/Object Pascal也應運而生。這些新的語言使得程序員在開發過程中能夠更簡單,更有效率,使軟件開發人員得以應付快速的軟件開發的要求。而彙編語言由於其複雜性使得其適用領域逐步減小。但這並不意味着彙編已無用武之地。由於彙編更接近機器語言,能夠直接對硬件進行操作,生成的程序與其他的語言相比具有更高的運行速度,佔用更小的內存,因此在一些對於時效性要求很高的程序、許多大型程序的核心模塊以及工業控制方面大量應用。 [1] 
雖然隨着半導體技術、編程技術的不斷髮展,在實際工程應用中確實很少看到彙編語言的身影,但這並不能説明彙編語言沒用,已被其他高級語言所取代。嵌入式系統底層驅動、計算機的BIOS還是要用匯編語言實現。彙編語言是培養學生理解硬件資源的語言,是學習和理解其他高級程序設計語言的基礎,是計算機組成原理、接口與通信技術、計算機控制技術和數據採集等許多專業課的前導課程,是必要的基礎知識,起着承上啓下的作用。 [5] 
參考資料