組合語言

維基百科,自由的百科全書
(重定向自組合語言
跳轉到: 導覽搜尋
組合語言圖解

組合語言英語Assembly language)是一種用於電子電腦微處理器微控制器或其他可編程器件的低階語言,在不同的裝置中,組合語言對應著不同的機器語言指令集。一種組合語言專用於某種電腦系統結構,而不像許多高階語言,可以在不同系統平台之間移植。

使用組合語言編寫的原始碼,需要透過使用相應的組譯程式將它們轉換成可執行的機器碼。這一過程被稱為組譯過程

組合語言採用了助憶碼mnemonics)來代表特定低階機器語言的操作。特定的組譯標的指令集可能會包括特定的運算元。許多組譯程式可以識別代表位址和常量的標籤(label)和符號(symbols),這樣就可以用字元來代表運算元而無需採取寫死的方式。普遍地說,特定的組合語言和特定的機器語言指令集是一一對應的。

許多組譯程式為程式開發、組譯控制、輔助偵錯提供了額外的支援機制。有的組合語言編程工具經常會提供巨集,它們也被稱為宏組譯器。

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

組譯器[編輯]

Motorola MC6800 組合語言

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

現狀[編輯]

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

此外,雖然有眾多程式語言可供選擇,但組譯依然是各大學電腦科學類專業學生的必修課,以讓學生深入了解電腦的執行原理。

Intel組譯與AT&T組譯[編輯]

組譯指令的兩大風格分別是Intel組譯與AT&T組譯,分別被Microsoft Windows/Visual C++Linux/gcc採用:

專案 Intel風格 AT&T風格
運算元順序 標的運算元在前 源運算元在前
暫存器名字 原樣 加%字首
立即數 原樣 加$字首
16進制立即數 用字尾b與h分別表示二進制與十六進制
對於16進制字母開頭的要加字首0
加字首0x
存取記憶體長度的表示 字首byte ptr, word ptr, dword ptr 字尾b、w、l表示位元組、字、長型
參照全域或靜態變數var的值 [_var] _var
參照全域或靜態變數var的位址 _var $_var
參照局部變數 需要基於棧指標(ESP)
記憶體直接定址 seg_reg: [base + index * scale + immed32] seg_reg: immed32 (base, index, scale)
暫存器間址 [reg] (%reg)
暫存器變址定址 [reg + _x] _x(%reg)
立即數變址定址 [reg + 1] 1(%reg)
整數陣列定址 [eax*4 + array] _array (,%eax, 4)


參見[編輯]

外部連結[編輯]