x86 彙編/x86 彙編器
有許多不同的彙編器可用於 x86 架構。此頁面將列出其中一些,並將討論從何處獲取這些彙編器、它們適合什麼以及它們最常在哪裡使用。
GNU 彙編器 (GAS)
[編輯 | 編輯原始碼]GNU 彙編器最常見的是 GCC 編譯器的彙編後端。學習 GAS(因為它經常被縮寫)程式設計最令人信服的理由之一是編寫內聯彙編指令(嵌入在 C 原始碼中的彙編程式碼),因為這些指令(當由 gcc 編譯時)需要採用 GAS 語法。GAS 使用 AT&T 語法編寫組合語言,有些人認為它更復雜,但另一些人則認為它提供更多資訊。
注意:最近版本的 GCC 包括“-masm”選項,當設定為“-masm=intel”時,允許使用者使用 Intel 語法定義內聯彙編。GAS 的等效選項是“-msyntax=intel”或使用“.intel_syntax”指令。
Microsoft 的宏彙編器 MASM 已經持續生產多年。許多人聲稱 MASM 不再得到支援或改進,但 Microsoft 否認了這一點:MASM 仍在維護,但目前處於修復錯誤模式。目前沒有新增新功能。但是,Microsoft 正在與其新的 64 位編譯器套件一起釋出 64 位版本的 MASM。MASM 可從 Microsoft 獲取,作為 Visual C++ 的一部分,從 MSDN 下載,或作為 Microsoft DDK 的一部分。最新版本的 MASM 是 11.x 版(參考:www.masm32.com)。
MASM 使用 Intel 語法編寫指令,這與 GAS 彙編器使用的 AT&T 語法形成鮮明對比。最值得注意的是,MASM 指令採用與 GAS 相反的順序接收其運算元。這也許是人們試圖在兩個彙編器之間轉換時遇到的最大障礙。
MASM 還擁有一個非常強大的宏引擎,許多程式設計師使用它在 MASM 程式中實現高階的感覺。
JWASM 是一個 16 位、32 位和 64 位的 80x86 平臺彙編器,基於 Open Watcom 的 WASM,由 Japheth 建立。
雖然在語法上與 MASM 相容,但它更快,並且它的原始碼在 Sybase Open Watcom 公共許可證下免費提供,因此它可以免費用於商業和非商業用途。此外,它支援 ELF,因此它是唯一支援流行 MASM 語法的跨平臺彙編器。JWASM 正在積極開發中,通常被認為是 MASM 的非官方繼任者。
[失效連結]
Netwide 彙編器 NASM 最初是一個開源專案,旨在為 80x86 平臺建立一個免費的、可重新定位的彙編器。當 NASM 專案啟動時,MASM 仍在由 Microsoft 出售(MASM 目前是免費的),而 GAS 幾乎沒有錯誤檢查功能。畢竟,GAS 是 GCC 的後端,而 GCC 始終向 GAS 提供語法正確的程式碼。因此,GAS 不需要與使用者互動太多,因此編寫 GAS 程式碼非常困難。
NASM 使用與“Intel 類似但不太複雜”的語法。
NASM 使用者手冊位於 http://www.nasm.us/doc/ 。
特徵
- 跨平臺:與 Gas 一樣,這個彙編器在幾乎所有平臺上執行,據說甚至在 PowerPC Mac 上執行(儘管生成的程式碼只會在 x86 平臺上執行)
- 開源
- 宏語言(編寫程式碼的程式碼)
雖然它是用匯編編寫的,但它在幾個作業系統上執行,包括 DOS、DexOS、Linux、Windows 和 BSD。它的語法類似於 TASM 的“理想模式”和 NASM 的,但這個彙編器中的宏的實現方式不同。
特徵
- 用它本身編寫;因此它的原始碼是關於如何在該彙編器中編寫程式碼的示例
- 開源
- 簡潔的類似 NASM 的語法
- 非常快
- 有宏語言(編寫程式碼的程式碼)
- 內建的 DOS 和 Windows IDE
- 建立二進位制、MZ、PE、ELF、COFF - 無需連結器
YASM 是 NASM 的完全重寫,使用新的 BSD 許可證。YASM 旨在原生理解多種語法(目前是 NASM 和 GAS)。YASM 的主要重點是生成“libyasm”,一個可重用的庫,可以在低級別使用程式碼,並且可以輕鬆地整合到其他軟體專案中。
HLA 是 Randall Hyde 建立的一個彙編前端,最初在他的書“彙編藝術”中流行起來。
HLA 接受使用高階格式編寫的彙編程式碼,並將程式碼轉換為另一種格式(通常為 MASM 或 GAS)。然後,另一個彙編器(MASM 或 GAS)將指令組裝成機器程式碼。
專有的 BBC BASIC for Windows 支援使用 INTEL 語法開發針對 Windows 使用者模式的 32 位 x86 彙編器,但目前不允許生成獨立的 EXE 檔案(不包含專有執行時和環境)。宏彙編可以透過使用 BBC BASIC 環境,透過將宏定義為圍繞相關程式碼的基本函式來實現。
更多資訊請參見 手冊中的彙編器部分