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 环境,通过将宏定义为围绕相关代码的基本函数来实现。
更多信息请参见 手册中的汇编器部分