什麼是「組合語言」?
組合語言,英文名為「Assembly Language」。是一種與硬體有著密切關係的低階語言,並且根據CPU(中央處理器)或單晶片所使用之指令集的不同,組合語言的語法也不相同。相較於其他的高階程式語言,組合語言的結構簡單得多了,幾乎就是很單純的從上到下一行指令做一個動作。就連迴圈(Looping)的做法也只是使用跳躍(Jump)指令跳回上面的標籤,達到重複執行指令的目的。
自然語言、高階語言、低階語言,是什麼?
自然語言(Nature Language)
自然語言為人類(Humans)所使用的語言,比電腦的高階語言等級還要更高,是當代電腦的發展方向,也就是我們平常聽到的「人工智慧」(Artificial Intelligence, AI)。自然語言科技就是要發展出一套電腦可以用類似人腦思考的模式來分析人類語言,進而再判斷反應的程式語言。
高階語言(High-Level Language)
高階語言是目前最常見的程式語言,一行高階語言的敘述式就相當於低階語言的多行指令,比低階語言更容易撰寫,語法也跟人類所使用的英文接近。相較於受硬體束縛頗大的低階語言,高階語言不會受到不同CPU的影響,具有非機器依存(Machine-independent)的特性,可以在不同機器間移植,但不一定能在不同操作系統(Operating System)上編譯或執行。使用高階語言所撰寫的程式,必須透過直譯器(Interpreter)或是編譯器(Compiler)轉換成電腦看得懂的機器碼(Machine Code),CPU才能執行。高階語言可以依照觀念上的不同,再細分為程序導向語言和物件導向語言。
程序導向語言(Procedure-Oriented Language)
程序導向語言是照著一般的邏輯程序,按部就班地設計程式。根據想要取得的成果,將處理的過程(Algorithm, 演算法)撰寫成程式,讓電腦能依序執行以完成工作。
物件導向語言(Object-Oriented Language)
物件導向程式語言,是以「物件」觀念來設計程式,也就是物件導向程式設計(Object-Oriented Programming, OOP)。在現實中所看到的各種實體,像是樹木、建築物、電視、車、人,都是物件(Object)。物件導向程式設計就是去抽象(Abstraction)描述出這些物件,再藉由組合這些物件,建立互動關係,來完成指定的工作。以物件為主的設計方式,程式碼可以被重複使用,因此能減少開發時間,也比較容易維護。物件導向是高階語言發展的趨勢,過去許多程序導向語言也陸續加入了物件導向的特性。物件導向的三大特性為「封裝(Encapsulation)」、「繼承(Inheritance)」、「多型(Polymorphism)」。
低階語言(Low-Level Programming Language)
低階語言比較接近電腦本身的語言,人類比較難看得懂。低階語言之所以會被稱為低階,是因為該種語言在運行的時候無法進一步的抽象化,直接與硬體溝通,與CPU的指令集相對應,效能很好,但也因此擁有機器依存(Machine-dependent)的特性,無法在不同CPU之間移植。低階語言可以被分為兩代:
第一代:機器語言(Machine Language)
機器語言為電腦能直接辨識的語言,透過二進制指令集代碼(1與0的組合而成的指令)直接操控電腦硬體。由於跟人類使用的自然語言相差甚遠,十分難懂。
第二代:組合語言(Assembly Language)
因為機器語言讀寫不易,因此後來發展出組合語言,改用簡短的字串和較為整齊的語法來取代機器語言的1與0組合。這些簡短的字串稱作輔助記憶碼(Mnemonics),或簡稱易記碼、助憶碼,為英文單字的前面幾個字母或縮寫。例如:Add代表「加」、Sub代表「減」、Inc代表「累加」、Mov代表「移動」。由於CPU只認得機器碼,因此組合語言所撰寫的程式依然需要經由組譯器(Assembler)來轉譯為機器碼,這部分在稍後會做介紹。組合語言和機器語言一樣,是直接對CPU的暫存器(Register)進行操作,依然屬於低階語言,具機器依存性。
組譯器與連結器
組譯器(Assembler)
組譯器用來將組合語言使用的原始檔(.asm)翻譯成含有機器碼的二進制目的碼(Object Code)。
連結器(Linker)
連結器用來將一個或多個目的碼檔案連結函式庫為一個可執行檔案。
結論
學習組合語言,可以透過一條條的指令知道電腦究竟是如何進行資料的處理,加強硬體和邏輯方面的觀念。我在高二時有幸學到一些80X86 CPU的16位元組合語言程式,抄了不少的筆記,往後會慢慢整理到電腦不難上。