組合語言介紹
組合語言是機器語言或機器程式碼的人類可讀形式,它是處理器邏輯執行的實際位和位元組序列。人類通常比二進位制,八進位制或十六進位制更容易閱讀和程式設計助記符,因此人們通常用組合語言編寫程式碼,然後使用一個或多個程式將其轉換為處理器理解的機器語言格式。
例:
mov eax, 4
cmp eax, 5
je point
彙編程式是一個程式,它讀取組合語言程式,解析它並生成相應的機器語言。重要的是要理解,與 C++之類的語言(標準文件中定義的單一語言)不同,有許多不同的組合語言。每個處理器體系結構,ARM,MIPS,x86 等具有不同的機器程式碼,因此具有不同的組合語言。此外,對於相同的處理器體系結構,有時會有多種不同的組合語言。特別是,x86 處理器系列有兩種流行的格式,通常被稱為氣體語法 (gas
是 GNU 彙編程式的可執行檔案的名稱)和英特爾語法 (以 x86 處理器系列的發起者命名)。它們是不同的但是相同的,因為通常可以用任一語法編寫任何給定的程式。
通常,處理器的發明者記錄處理器及其機器程式碼並建立組合語言。這種特定組合語言通常是唯一使用的組合語言,但與編譯器編寫者試圖符合語言標準不同,處理器發明者定義的組合語言通常但並不總是編寫彙編程式的人使用的版本。。
有兩種通用型別的處理器:
-
CISC(複雜指令集計算機):有許多不同且通常很複雜的機器語言指令
-
RISC(精簡指令集計算機):相比之下,指令更少,更簡單
對於組合語言程式設計師來說,不同之處在於 CISC 處理器可能需要學習很多指令,但通常有適合特定任務的指令,而 RISC 處理器的指令更少且更簡單,但任何給定的操作都可能需要組合語言程式設計師寫更多指令以完成同樣的事情。
其他程式語言編譯器有時會首先生成彙編程式,然後通過呼叫匯程式設計序將其編譯為機器程式碼。例如, gcc 在編譯的最後階段使用自己的氣體彙編程式。生成的機器程式碼通常儲存在目標檔案中,目標檔案可以通過連結器程式連結到可執行檔案中。
完整的工具鏈通常由編譯器,彙編器和連結器組成。然後,可以直接使用匯程式設計序和連結程式以組合語言編寫程式。在 GNU 世界中, binutils 包包含彙編器和連結器以及相關工具; 那些只對組合語言程式設計感興趣的人不需要 gcc 或其他編譯器包。
小型微控制器通常僅以組合語言或組合語言與一種或多種更高階語言(如 C 或 C++)的組合程式設計。這樣做是因為人們經常可以使用指令集架構的特定方面來為這些裝置編寫比在更高階語言中更高的緊湊,高效的程式碼,並且這種裝置通常具有有限的儲存器和暫存器。許多微處理器用於嵌入式系統這些裝置是通用計算機以外的其他裝置。這種嵌入式系統的例子是電視機,微波爐和現代汽車的發動機控制單元。許多這樣的裝置沒有鍵盤或螢幕,因此程式設計師通常將程式寫在通用計算機上,執行交叉彙編程式 (因為這種彙編程式為不同型別的處理器生成程式碼而不是執行它的處理器)和/或交叉編譯器和交叉連結器以生成機器程式碼。
這些工具有許多供應商,它們與生成程式碼的處理器一樣多種多樣。許多(但並非所有)處理器都有一個開源解決方案,如 GNU,sdcc,llvm 或其他。