彙編語言

彙編語言

面向機器的程序設計語言
彙編語言(Assembly Language)是面向機器的程序設計語言。在彙編語言中,用助記符(Mnemonics)代替機器指令的操作碼,用地址符号(Symbol)或标号(Label)代替指令或操作數的地址,如此就增強了程序的可讀性并且降低了編寫難度,象這樣符号化的程序設計語言就是彙編語言,因此亦稱為符号語言。使用彙編語言編寫的程序,機器不能直接識别,還要由彙編程序或者叫彙編語言編譯器(即彙編器)轉換成機器指令。彙編程序将符号化的操作代碼組裝成處理器可以識别的機器指令,這個組裝的過程稱為組合或者彙編。因此,有時候人們也把彙編語言稱為組合語言。
    中文名:彙編語言 外文名:Assembly Language 學科:軟件工程 産生年代:20世紀50年代 編譯方式:彙編

簡介

彙編語言是一種功能很強的程序設計語言,也是利用計算機所有硬件特性并能直接控制硬件的語言。彙編語言,作為一門語言,對應于高級語言的編譯器,需要一個“彙編器”來把彙編語言原文件彙編成機器可執行的代碼。高級的彙編器如MASM,TASM等等為我們寫彙編程序提供了很多類似于高級語言的特征,比如結構化、抽象等。在這樣的環境中編寫的彙編程序,有很大一部分是面向彙編器的僞指令,已經類同于高級語言。現在的彙編環境已經如此高級,即使全部用彙編語言來編寫windows的應用程序也是可行的,但這不是彙編語言的長處。彙編語言的長處在于編寫高效且需要對機器硬件精确控制的程序。

符号語言

在彙編語言中,用助記符(Memoni)代替操作碼,用地址符号(Symbol)或标号(Label)代替地址碼。這樣用符号代替機器語言的二進制碼,就把機器語言變成了彙編語言。因此彙編語言亦稱為符号語言。

彙編

使用彙編語言編寫的程序,機器不能直接識别,要由一種程序将彙編語言翻譯成機器語言,這種起翻譯作用的程序叫彙編程序,彙編程序是系統軟件中語言處理系統軟件。彙編語言編譯器把彙編程序翻譯成機器語言的過程稱為彙編。

不能通用

彙編語言比機器語言易于讀寫、調試和修改,同時具有機器語言全部優點。但在編寫複雜程序時,相對高級語言代碼量較大,而且彙編語言依賴于具體的處理器體系結構,不能通用,因此不能直接在不同處理器體系結構之間移植。

彙編語言是—種編程語言

計算機語言從低級到高級可以分為:

機器語言,即由0、1組成的機器硬件可以識别的語言;低級語言,即彙編語言

中級語言,如C語言

高級語言,如C++,JAVA,C#等。

彙編語言是将由0、1組成的機器語言用具有簡單語義的英文代碼表示,以便于理解和程序員編程。彙編語言通常用于對硬件的直接操控。由于彙編語言編寫的程序很小,所以通常在程序中最核心的、控制硬件的代碼可以采用彙編語言編寫,—方面是安全,另一方面提高運行速度。

對于計算機的初學者,應該從中高級語言學起,如c語言,vbjava等,如果你是想要學習如何編程,學習一到兩門高級語言已經夠用了。

如果你已經掌握了基本的編程技能,最好是可以學習數據結構和操作系統以及計算機硬件的基本工作原理,以便優化你編寫的程序,提高安全性和運行效率。

如果你想要從事更高級的開發工作,則可能需要學習彙編語言。

在高校中,計算機科技專業的學生彙編語言是必修課,而軟件工程專業的學生則對彙編語言不做要求。至于彙編與編程的區别是顯而易見的,彙編語言是一種用于編寫某些程序的語言。而編程則是程序員用某種語言編寫程序的過程。

發展曆程

編程語言

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

機器語言

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

彙編語言

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

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

高級語言

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

特點

彙編語言是直接面向處理器(Processor)的程序設計語言。處理器是在指令的控制下工作的,處理器可以識别的每一條指令稱為機器指令。每一種處理器都有自己可以識别的一整套指令,稱為指令集。處理器執行指令時,根據不同的指令采取不同的動作,完成不同的功能,既可以改變自己内部的工作狀态,也能控制其它外圍電路的工作狀态。

在電路中,每條機器指令都表現為一組電信号,通過一排導線進入處理器。這些電信号有的呈高電平,有的呈低電平,哪些為高,哪些為低,取決于不同的機器指令。如果把高電平記為“1”,低電平記為“0”,那麼,不同的機器指令将表現為不同的二進制序列,由于它們的無規律性,這就使得機器指令難以理解、書寫和記憶。

人類最容易接受自己每天都使用的自然語言。為了使機器指令的書寫和理解變得容易,需要借鑒自然語言的優點,為此就引入了彙編語言。彙編語言使用符号來代表不同的機器指令,而這些符号非常接近于自然語言的要素。基本上,彙編語言裡的每一條指令,都對應着處理器的一條機器指令。

彙編語言包括兩個部分:語法部分和彙編器。語法部分提供與機器指令相對應的助記符,方便指令的書寫和閱讀。當然,彙編語言的符号可以被人類接受,但不能被處理器識别,為此,還要由彙編語言編譯器将這些助記符轉換成機器指令。

根據應用領域的不同,處理器的種類繁多,比如用于工業控制和嵌入式計算的Z80、MC68000和MCS-51、廣泛應用于個人計算機的INTELx86系列,以及基于ARM體系結構的處理器,包括蘋果公司在内的大企業都是ARM的客戶。事實上,今天的ARM是最受歡迎的32位嵌入式處理器,而且,今天的ARM處理器比INTEL奔騰系列賣得還多,基本上是3:1的比例。

不同的處理器有不同的指令集。正是因為這個原因,每一種處理器都會有自己專屬的彙編語言語法規則和編譯器。即使是同一種類型的處理器,也可能擁有不同的彙編語言編譯器。一個明顯的例子是INTELx86系列的處理器,圍繞它就開發出好多種編譯器來,如MASM、NASM、FASM、TASM、GAS和AT&T等。而且,每一種編譯器,都使用不同的語法。

優點與缺點

優點

彙編語言直接同計算機的底層軟件甚至硬件進行交互,它具有如下一些優點:

(1)能夠直接訪問與硬件相關的存儲器或I/O端口;

(2)能夠不受編譯器的限制,對生成的二進制代碼進行完全的控制;

(3)能夠對關鍵代碼進行更準确的控制,避免因線程共同訪問或者硬件設備共享引起的死鎖;

(4)能夠根據特定的應用對代碼做最佳的優化,提高運行速度;

(5)能夠最大限度地發揮硬件的功能。

(6)彙編語言用來編制系統軟件和過程控制軟件,其目标程序占用内存空間少,運行速度快,有着高級語言不可替代的用途。

缺點

同時還應該認識到,彙編語言是一種層次非常低的語言,它僅僅高于直接手工編寫二進制的機器指令碼,因此不可避免地存在一些缺點:

(1)編寫的代碼非常難懂,不好維護;

(2)很容易産生bug,難于調試;

(3)隻能針對特定的體系結構和處理器進行優化;

(4)開發效率很低,時間長且單調。

(5)彙編語言像機器指令一樣,是硬件操作的控制信息,因而仍然是面向機器的語言,使用起來還是比較繁瑣費時,通用性也差。

應用

曆史上,彙編語言曾經是非常流行的程序設計語言之一。随着軟件規模的增長,以及随之而來的對軟件開發進度和效率的要求,高級語言逐漸取代了彙編語言。但即便如此,高級語言也不可能完全替代彙編語言的作用。就拿Linux内核來講,雖然絕大部分代碼是用C語言編寫的,但仍然不可避免地在某些關鍵地方使用了彙編代碼。由于這部分代碼與硬件的關系非常密切,即使是C語言也會顯得力不從心,而彙編語言則能夠很好揚長避短,最大限度地發揮硬件的性能。

首先,彙編語言的大部分語句直接對應着機器指令,執行速度快,效率高,代碼體積小,在那些存儲器容量有限,但需要快速和實時響應的場合比較有用,比如儀器儀表和工業控制設備中。

其次,在系統程序的核心部分,以及與系統硬件頻繁打交道的部分,可以使用彙編語言。比如操作系統的核心程序段、I/O接口電路的初始化程序、外部設備的低層驅動程序,以及頻繁調用的子程序、動态連接庫、某些高級繪圖程序、視頻遊戲程序等等。

再次,彙編語言可以用于軟件的加密和解密、計算機病毒的分析和防治,以及程序的調試和錯誤分析等各個方面。

最後,通過學習彙編語言,能夠加深對計算機原理和操作系統等課程的理解。通過學習和使用彙編語言,能夠感知、體會和理解機器的邏輯功能,向上為理解各種軟件系統的原理,打下技術理論基礎;向下為掌握硬件系統的原理,打下實踐應用基礎。

Linux彙編語言

彙編代碼

作為最基本的編程語言之一,彙編語言雖然應用的範圍不算很廣,但重要性卻勿庸置疑,因為它能夠完成許多其它語言所無法完成的功能。就拿Linux内核來講,雖然絕大部分代碼是用C語言編寫的,但仍然不可避免地在某些關鍵地方使用了彙編代碼,其中主要是在Linux的啟動部分。由于這部分代碼與硬件的關系非常密切,即使是C語言也會有些力不從心,而彙編語言則能夠很好揚長避短,最大限度地發揮硬件的性能。

Linux程序員

大多數情況下Linux程序員不需要使用彙編語言,因為即便是硬件驅動這樣的底層程序在Linux操作系統中也可以用完全用C語言來實現,再加上GCC這一優秀的編譯器目前已經能夠對最終生成的代碼進行很好的優化,的确有足夠的理由讓我們可以暫時将彙編語言抛在一邊了。但實現情況是Linux程序員有時還是需要使用彙編,或者不得不使用彙編,理由很簡單:精簡、高效和libc無關性。假設要移Linux到某一特定的嵌入式硬件環境下,首先必然面臨如何減少系統大小、提高執行效率等問題,此時或許隻有彙編語言能幫上忙了。

優點

彙編語言直接同計算機的底層軟件甚至硬件進行交互,它具有如下一些優點:

能夠直接訪問與硬件相關的存儲器或I/O端口;

能夠不受編譯器的限制,對生成的二進制代碼進行完全的控制;

能夠對關鍵代碼進行更準确的控制,避免因線程共同訪問或者硬件設備共享引起的死鎖;

能夠根據特定的應用對代碼做最佳的優化,提高運行速度;

能夠最大限度地發揮硬件的功能。

缺點

同時還應該認識到,彙編語言是一種層次非常低的語言,它僅僅高于直接手工編寫二進制的機器指令碼,因此不可避免地存在一些缺點:

•編寫的代碼非常難懂,不好維護;

•很容易産生bug,難于調試;

•隻能針對特定的體系結構和處理器進行優化;

•開發效率很低,時間長且單調。

兩種不同的形式

Linux下用彙編語言編寫的代碼具有兩種不同的形式。第一種是完全的彙編代碼,指的是整個程序全部用彙編語言編寫。盡管是完全的彙編代碼,Linux平台下的彙編工具也吸收了C語言的長處,使得程序員可以使用#include、#ifdef等預處理指令,并能夠通過宏定義來簡化代碼。第二種是内嵌的彙編代碼,指的是可以嵌入到C語言程序中的彙編代碼片段。雖然ANSI的C語言标準中沒有關于内嵌彙編代碼的相應規定,但各種實際使用的C編譯器都做了這方面的擴充,這其中當然就包括Linux平台下的GCC。

應用舉例

用彙編語言實現RESET啟動和熱啟動

程序名:RESET.ASM/BOOT.ASM程序類别:完整的彙編語言程序

功能:用程序完成RESET啟動和熱啟動

使用說明:彙編連接以後轉換為com文件運行

程序說明:

在日常用機過程中,如果出現了異常情況常常需要重新啟動系統。對于IBMPC以及其兼容機,除了開機冷啟動外,還有熱啟動和RESET開關複位啟動,他們的共同特點是轉入BIOS的入口點(即ROM的起始單元FFFF:0處),執行該處的跳轉指令,轉向啟動程序,該啟動程序在執行過程中需檢測複位标志字(在地址0040:0072處,占2個字節)的值,若為1234則啟動是不檢測内存;若非1234則啟動先檢測内存,再啟動系統。熱啟動和RESET啟動的不同之處在于熱啟動時不檢測内存,而RESET啟動是需要檢測内存。

下面的倆個程序分别實現RESET啟動和熱啟動。經過彙編,連接再轉換成文件後才能運行。

RESET.ASMRESET開關複位啟動程序)

BOOT.ASM(熱啟動程序)

編譯環境

用彙編語言等非機器語言書寫好的符号程序稱為源程序,彙編語言編譯器的作用是将源程序翻譯成目标程序。目标程序是機器語言程序,當它被安置在内存的預定位置上後,就能被計算機的CPU處理和執行。

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

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

處理器指令集

數據傳送指令

這部分指令包括通用數據傳送指令MOV、條件傳送指令CMOVcc、堆棧操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交換指令XCHG/XLAT/BSWAP、地址或段描述符選擇子傳送指令LEA/LDS/LES/LFS/LGS/LSS等。注意,CMOVcc不是一條具體的指令,而是一個指令簇,包括大量的指令,用于根據EFLAGS寄存器的某些位狀态來決定是否執行指定的傳送操作。

整數和邏輯運算指令

這部分指令用于執行算術和邏輯運算,包括加法指令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等。

條件設置指令

這不是一條具體的指令,而是一個指令簇,包括大約30條指令,用于根據EFLAGS寄存器的某些位狀态來設置一個8位的寄存器或者内存操作數。比如SETE/SETNE/SETGE等等。

控制轉移指令

這部分包括無條件轉移指令JMP、條件轉移指令Jcc/JCXZ、循環指令LOOP/LOOPE/LOOPNE、過程調用指令CALL、子過程返回指令RET、中斷指令INTn、INT3、INTO、IRET等。注意,Jcc是一個指令簇,包含了很多指令,用于根據EFLAGS寄存器的某些位狀态來決定是否轉移;INTn是軟中斷指令,n可以是0到255之間的數,用于指示中斷向量号。

串操作指令

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

輸入輸出指令

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

高級語言輔助指令

這部分指令為高級語言的編譯器提供方便,包括創建棧幀的指令ENTER和釋放棧幀的指令LEAVE。

控制和特權指令

這部分包括無操作指令NOP、停機指令HLT、等待指令WAIT/MWAIT、換碼指令ESC、總線封鎖指令LOCK、内存範圍檢查指令BOUND、全局描述符表操作指令LGDT/SGDT、中斷描述符表操作指令LIDT/SIDT、局部描述符表操作指令LLDT/SLDT、描述符段界限值加載指令LSR、描述符訪問權讀取指令LAR、任務寄存器操作指令LTR/STR、請求特權級調整指令ARPL、任務切換标志清零指令CLTS、控制寄存器和調試寄存器數據傳送指令MOV、高速緩存控制指令INVD/WBINVD/INVLPG、型号相關寄存器讀取和寫入指令RDMSR/WRMSR、處理器信息獲取指令CPUID、時間戳讀取指令RDTSC等。

浮點和多媒體指令

這部分指令用于加速浮點數據的運算,以及用于加速多媒體數據處理的單指令多數據(SIMD及其擴展SSEx)指令。這部分指令數據非常龐大,無法一一列舉,請自行參考INTEL手冊。

虛拟機擴展指令

這部分指令包括INVEPT/INVVPID/VMCALL/VMCLEAR/VMLAUNCH/VMRESUME/VMPTRLD/VMPTRST/VMREAD/VMWRITE/VMXOFF/VMON等。

彙編語言的概念

彙編語言是一種功能很強的程序設計語言,也是利用計算機所有硬件特性并能直接控制硬件的語言。彙編語言的實質和機器語言是相同的,都是直接對硬件操作,隻不過指令采用了英文縮寫的标識符,更容易識别和記憶。nn彙編語言是計算機提供給用戶的執行效率極高、功能極強的一種程序設計語言,它能夠直接控制計算機硬件,并最大限度地發揮硬件的能力。對程序的執行時間和占用空間要求很高的場合,須使用彙編語言才能滿足要求。彙編語言還可以與高級語言混合編程,但由于編寫和調試彙編語言程序要比高級語言複雜,因此其應用不如高級語言廣泛。

彙編語言的特點

1.面向機器的低級語言,通常是為特定的計算機或系列計算機專門設計的。nn2.保持了機器語言的優點,具有直接和簡捷的特點。nn3.可有效地訪問、控制計算機的各種硬件設備。nn4.目标代碼簡短,占用内存少,執行速度快,是高效的程序設計語言。nn5.經常與高級語言配合使用,應用十分廣泛。彙編語言的概念

彙編語言是一種功能很強的程序設計語言,也是利用計算機所有硬件特性并能直接控制硬件的語言。彙編語言的實質和機器語言是相同的,都是直接對硬件操作,隻不過指令采用了英文縮寫的标識符,更容易識别和記憶。nn彙編語言是計算機提供給用戶的執行效率極高、功能極強的一種程序設計語言,它能夠直接控制計算機硬件,并最大限度地發揮硬件的能力。對程序的執行時間和占用空間要求很高的場合,須使用彙編語言才能滿足要求。彙編語言還可以與高級語言混合編程,但由于編寫和調試彙編語言程序要比高級語言複雜,因此其應用不如高級語言廣泛。n

彙編語言源程序的組成原則

    完整的彙編語言源程序由段組成。一個彙編語言源程序可以包含若幹個代碼段、數據段、附加段或堆棧段,段與段之間的順序可随意排列。n需要獨立運行的程序必須包含一個代碼段,并指示程序執行的起始點,一個程序隻有一個起始點。n所有的可執行性語句必須位于某一個代碼段内,說明性語句可根據需要位于任一段内。

對比高級語言

區别

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

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

聯系

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

相關技術

彙編器

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

編譯環境

用彙編語言等非機器語言書寫好的符号程序稱為源程序,彙編語言編譯器的作用是将源程序翻譯成目标程序。目标程序是機器語言程序,當它被安置在内存的預定位置上後,就能被計算機的CPU處理和執行。

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

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

發展前景

彙編語言是機器語言的助記符,相對于比枯燥的機器代碼易于讀寫、易于調試和修改,同時優秀的彙編語言設計者經過巧妙的設計,使得彙編語言彙編後的代碼比高級語言執行速度更快,占内存空間少等優點,但彙編語言的運行速度和空間占用是針對高級語言并且需要巧妙設計,而且部分高級語言在編譯後代碼執行效率同樣很高,所以此優點慢慢弱化。而且在編寫複雜程序時具有明顯的局限性,彙編語言依賴于具體的機型,不能通用,也不能在不同機型之間移植。常說彙編語言是低級語言,并不是說彙編語言要被棄之,相反,彙編語言仍然是計算機(或微機)底層設計程序員必須了解的語言,在某些行業與領域,彙編是必不可少的,非它不可适用。隻是,現在計算機最大的領域為IT軟件,也是我們常說的計算機應用軟件編程,在熟練的程序員手裡,使用彙編語言編寫的程序,運行效率與性能比其它語言寫的程序相對提高,但是代價是需要更長的時間來優化,如果對計算機原理及編程基礎不紮實,反而增加其開發難度,實在是得不償失,對比2010年前後的軟件開發,已經是市場化的軟件行業,加上高級語言的優秀與跨平台,一個公司不可以讓一個團隊使用彙編語言來編寫所有的東西,花上幾倍甚至幾十倍的時間,不如使用其它語言來完成,隻要最終結果不比彙編語言編寫的差太多,就能搶先一步完成,這是市場經濟下的必然結果。

但是,迄今為止,還沒有程序員敢斷定彙編語言是不需要學的,同時,彙編語言(Assembly Language)是面向機器的程序設計語言,設計精湛的彙編程序員,部分已經脫離軟件開發,擠身于工業電子編程中。對于功能相對小巧但硬件對語言設計要求苛刻的行業,如4位單片機,由于其容量及運算,此行業的電子工程師一般負責從開發設計電路及軟件控制,主要開發語言就是彙編,c語言使用隻占極少部分,而電子開發工程師是千金難求,在一些工業公司,一個核心的電子工程師比其它任何職員待遇都高,對比起來,一般電子工程師待遇是程序員的十倍以上。這種情況是因為21世紀以來,學習彙編的人雖然也不少,但是真正能學到精通的卻不多,它相對于高級語言難學,難用,适用範圍小,雖然簡單,但是過于靈活,學習過高級語言的人去學習彙編比一開始學彙編的人難得多,但是學過彙編的人學習高級語言卻很容易,簡從繁易,繁從簡難。對于一個全面了解微機原理的程序員,彙編語言是必修語言。

經典教材

彙編語言教材很多,各種處理器都有涉及,粗略統計不下百種。在這麼多的教材裡,用得較多的可以分類列舉如下:

x86處理器

1.《x86彙編語言:從實模式到保護模式》,李忠著,電子工業出版社,2013-1。

基于INTELx86處理器、NASM編譯器和BOCHS虛拟機。彙編語言就是處理器的語言,從這個意義上來說,既然學習彙編語言,就必須直接面向硬件編程,而不是使用莫名其妙的DOS中斷和API調用。這是一本有趣的書,它沒有把篇幅花在計算一些枯燥的數學題上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、Windows、Linux或者任何其他軟件支持的情況下來顯示字符、讀取硬盤數據、控制其他硬件等。

我們知道,32位和64位是主流,實模式和DOS操作系統已經成為曆史,Linux和Windows都工作在保護模式下。這本書從實模式講到32位保護模式,尤其以32位保護模式為重點,閱讀本書,對理解現代計算機和現代操作系統的工作原理有非常大的幫助作用。

2.《彙編語言》(第2版),王爽著,清華大學出版社,2008-4-1

基于INTEL8086處理器、MASM編譯器,以及DOS平台的彙編教材,完全以8086處理器的實模式為主,不涉及常用的32位和64位模式,但因為通俗易懂,讀者反映很好。

3.《80X86彙編語言程序設計教程》,楊季文等編著,清華大學出版社,1999-3-1

基于INTELx86處理器、MASM和TASM編譯器,包含16位實模式和32位保護模式的内容,而且對後者講述較為詳細。

4.《32位彙編語言程序設計》,錢曉捷編著,機械工業出版社,2011-8-1

基于INTELx86處理器、MASM編譯器,以及WINDOWS平台的彙編教材。

5.《16/32位微機原理彙編語言及接口技術》,錢曉捷,陳濤編著,機械工業出版社,2005-2-1

基于INTELx86處理器,論述16位微型計算機的基本原理、彙編語言和接口技術,并引出32位微機系統相關技術。

6.《Intel彙編語言程序設計》(第五版),(美)歐文著,電子工業出版社,2012-7-1

基于INTELx86處理器、MASM編譯器,以及DOS/WINDOWS平台的彙編教材,既有16位實模式的内容,也有32位保護模式的内容。

7.《彙編語言的編程藝術》(第2版),(美)海德著,清華大學出版社,2011-12-1

基于INTELx86處理器,使用了作者自制的高級語言彙編器(HighLevelAssembler,HLA)作為教學工具,以部分地獲得高級語言的優勢和功能。

8.《x86PC彙編語言、設計與接口》(第五版),(美)馬茲迪,考西著,電子工業出版社,2011-1-1

基于INTELx86處理器,既講了16位實模式的内容,也講了32位保護模式的内容,對64位也有所介紹。

ARM及單片機

1.《彙編語言程序設計--基于ARM體系結構》(第2版),文全剛等主編,北京航空航天大學出版社,2010-8-1

基于ARM體系結構的處理器,是學習嵌入式技術的入門教材。

2.《零基礎學AVR單片機》,徐益民等編著,機械工業出版社,2011-1-1

單片機概述、avr單片機的開發工具、avr單片機c語言、atmega16單片機基本結構、avr的指令系統與彙編系統等。

3.《基于Multisim10的51單片機仿真實戰教程》,聶典,丁偉主編,電子工業出版社,2010-2-1

闡述了NI Multisim10在單片機仿真中的各項主要功能。

4.《PIC18微控制器:體系結構、編程與接口設計》,(美)貝裡著,清華大學出版社,2009-4-1

微控制器廣泛應用于汽車、家電、工業控制、醫療設備等衆多領域。本書以Microchip公司的PIC18系列微控制器為例,全面講解如何使用C語言和彙編語言對微控制器進行編程。

5.《CASL彙編語言程序設計》,趙立輝編著,中國電力出版社,2002-10-1

CASL彙編語言是中國計算機軟件專業技術資格和水平考試高級程序員級的必考内容。本書是講述CASL彙編語言程序設計的專著。

相關詞條

相關搜索

其它詞條