必威电竞|足球世界杯竞猜平台

匯編語言
來源:互聯網

匯編語言(assembly language)是一種用于電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符代替機器指令的操作碼,用地址符號或標號代替指令或操作數的地址。在不同的設備中,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器指令。特定的匯編語言和特定的機器語言指令集是一一對應的,不同平臺之間不可直接移植。

現在匯編語言已不像其他大多數的程序設計語言一樣被廣泛用于程序設計,在實際應用中,它通常被應用在底層硬件操作和高要求的程序優化的場合。驅動程序、嵌入式操作系統和實時運行程序中都需要匯編語言。

概念

匯編語言由匯編指令和匯編偽指令兩部分組成,匯編指令是機器指令的地址部分符號化表示。其操作碼采用易記的操作符表示,而地址碼則采用標號、變量名字、常數等直觀的表示形式。匯編指令基本上與機器指令保持一一對應的關系,在匯編過程中,它將被翻譯成對應的機器指令。運行時,它將執行相應機器指令所規定的功能,匯編偽指令又稱作匯編指示,其作用是指示匯編程序如何進行匯編,用于向匯編程序提供用戶自定義的符號、數據類型、數據空間長度、目標程序格式、數據或指令的存放位置等提示信息。采用匯編語言編寫程序雖不如高級語言簡單、直觀,而且必須對機器內部結構和特性有較多的了解,但它占用內存少?運行效率高,且能直接控制各種設備資源。因此,匯編語言經常用于編寫大型軟件系統的核心部分程序,或者用于編寫運行時間長或實時性要求高的程序部分。

在不斷吸收先進編程思想和相關軟件優點的基礎上,發展、演變出各具特色的匯編語言。模塊匯編語言是在模塊程序設計思想指導下,以模塊作為編程基本單位而設計的匯編語言。它支持單個模塊獨立匯編和多個模塊聯合匯編的功能,宏匯編語言是在匯編語言的基礎上,增加宏定義和宏調用功能而形成的匯編語言。它將為用戶提供自定義指令的功能,高級匯編語言是在匯編語言的基礎上,增加高級語言中控制語句成分(如條件語句、循環語句、函數和過程等)而成的匯編語言。它既保持匯編語言的有效性和靈活性,又充分發揮了高級語言簡單、直觀、易于編寫等優點,條件匯編語言是在匯編語言中引進“條件轉移”和“無條件轉移”等匯編指示,這將為用戶提供一種簡便、靈活的剪裁(選擇或跳過源程序)的手段。

發展歷程

編程語言階段

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

機器語言階段

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

匯編語言階段

不難看出機器語言作為一種編程語言, 靈活性較差可閱讀性也很差,為了減輕機器語言帶給軟件工程師的不適應,人們對機器語言進行了升級和改進:用一些容易理解和記憶的字母,單詞來代替一個特定的指令。通過這種方法,人們很容易去閱讀 已經完成的程序或者理解程序正在執行的功能,對現有程序的bug修復以及運營維護都變得更加簡單方便,這種語言就是我們所說的匯編語言, 即第二代計算機語言。

比起機器語言,匯編語言具有更高的機器相關性,更加便于記憶和書寫,但又同時保留了機器語言高速度和高效率的特點。匯編語言仍是面向機器的語言,很難從其代碼上理解程序設計意圖,設計出來的程序不易被移植,故不像其他大多數的高級計算機語言一樣被廣泛應用。所以在高級語言高度發展的今天,它通常被用在底層,通常是程序優化或硬件操作的場合。

語言組成

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

傳送指令

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

邏輯運算

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

移位指令

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

位操作

這部分指令包括位測試指令BT、位測試并置位指令BTS、位測試并復位指令BTR、位測試并取反指令BTC、位向前掃描指令BSF、位向后掃描指令BSR等。

控制轉移

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

串操作

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

輸入輸出

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

語言特點

匯編語言是計算機提供給用戶的最快最有效的語言,也是能夠利用計算機的所有硬件特性并能夠直接控制硬件的唯-語言。但是由于編寫和調試匯編語言程序要比高級語言復雜,因此目前其應用不如高級語言廣泛。

匯編語言比機器語言的可讀性要好,但跟高級語言比較而言,可讀性還是較差。不過采用它編寫的程序具有存儲空間占用少、執行速度快的特點,這些是高級語言所無法取代的。在實際應用中,是否使用匯編語言,取決于具體應用要求、軟件開發時間和質量等方面作權衡。

優點

匯編語言作為機器語言之上的第二代編程語言,它也有很多優點:

1)可以輕松的讀取存儲器狀態以及硬件I/O接口情況

2)編寫的代碼因為少了很多編譯的環節,可以能夠準備的被執行

3)作為一種低級語言,可擴展性很高

缺點

1)因為代碼非常單調,特殊指令字符很少,所以造成了代碼的冗長以及編寫的困難

2)因為匯編仍然需要自己去調用存儲器存儲數據,很容易出現BUG,而且調試起來也不容易

3)就算完成了一個程序,后期維護時候也需要耗費大量的時間。

4)因為機器的特殊性造成了代碼兼容性差的缺陷。

對比高級語言

區別

匯編語言的特點是能被計算機直接識別和執行,使用它進行編程可以減少占用空間、提高運行速度,并能直接對硬件實施控制。在需要實時控制的時候,有著不可替代的重要地位,但匯編語言在編程和理解時要復雜、困難一些,尤其是在進行數據處理或是邏輯運算時更加凸顯出其劣勢。

高級語言是面向使用者的語言,能更準確地被程序員所理解,它的表達能力強,功能多,編程效率高,上手速度快,自動化程度高,因而更受歡迎。在大部分軟件開發中,使用者都采用高級語言編程,以提高編程效率。但在要求存儲空間小,執行速度快,需直接對硬件進行控制的場合,則應用匯編語言編程,以達到優化程序速度的目的。

聯系

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

相關技術

匯編器

典型的現代匯編器(assembler)建造目標代碼,由解譯組語指令集的易記碼(mnemonics)到操作碼(OpCode),并解析符號名稱(symbolic names)成為存儲器地址以及其它的實體。使用符號參考是匯編器的一個重要特征,它可以節省修改程序后人工轉址的乏味耗時計算?;揪褪前褭C器碼變成一些字母而已,編譯的時候再把輸入的指令字母替換成為晦澀難懂機器碼。

編譯環境

用匯編語言等非機器語言書寫好的符號程序稱為源程序,匯編語言編譯器的作用是將源程序翻譯成目標程序。目標程序是機器語言程序,當它被安置在內存的預定位置上后,就能被計算機的CPU處理和執行。

匯編的調試環境總的來說比較少,也很少有非常好的編譯器。編譯器的選擇依賴于目標處理器的類型和具體的系統平臺。一般來說,功能良好的編譯器用起來應當非常方便,比如,應當可以自動整理格式、語法高亮顯示,集編譯、鏈接和調試為一體,方便實用。

對于廣泛使用的personal computer來說,可以自由選擇的匯編語言編譯器MASM、NASM、TASM、GAS、FASM、RADASM等,但大都不具備調試功能。如果是為了學習匯編語言,輕松匯編因為擁有一個完善的集成環境,是一款非常適合初學者的匯編編譯器。

發展前景

隨著現代軟件系統越來越龐大復雜,大量經過了封裝的高級語言如C/C++,Pascal/Object Pascal也應運而生。這些新的語言使得程序員在開發過程中能夠更簡單,更有效率,使軟件開發人員得以應付快速的軟件開發的要求。而匯編語言由于其復雜性使得其適用領域逐步減小。但這并不意味著匯編已無用武之地。由于匯編更接近機器語言,能夠直接對硬件進行操作,生成的程序與其他的語言相比具有更高的運行速度,占用更小的內存,因此在一些對于時效性要求很高的程序、許多大型程序的核心模塊以及工業控制方面大量應用。

雖然隨著半導體技術、編程技術的不斷發展,在實際工程應用中確實很少看到匯編語言的身影,但這并不能說明匯編語言沒用,已被其他高級語言所取代。嵌入式系統的底層驅動、計算機的BIOS還是要用匯編語言實現。匯編語言是培養學生理解硬件資源的語言,是學習和理解其他高級程序設計語言的基礎,是計算機組成原理、接口與通信技術、計算機控制技術和數據采集等許多專業課的前導課程,是必要的基礎知識,起著承上啟下的作用。

參考資料 >

生活家百科家居網