【问题标题】:Is assembly language `assembler` specific too? Which assembler is best?汇编语言“汇编器”也是特定的吗?哪个汇编程序最好?
【发布时间】:2011-01-01 00:21:55
【问题描述】:

我正在学习汇编语言。我从 Paul A. Carter 的 PC Assembly Language 开始,它使用 NASM(The Netwide Assembler)。然后在中间我切换并开始阅读使用 MASM 的Introduction to 80×86 Assembly Language and Computer Architecture

在我曾经写过的 NASM 中,用于初始化一个字节

db 110101b

在我正在使用的 MASM 中

字节 110101b

我正在看书。由于这些是汇编器指令,它们对于每个汇编器都是不同的。正确的? 这些汇编程序开发人员不遵循这些指令的标准吗?因为,他们知道助记符是特定于 CPU 的。因此,用汇编语言学习和编码是一件很痛苦的事情。

现在,如果他们遵循不同的指令,如果您更改汇编程序或切换操作系统(如果 MASM 开发人员使用 linux,他将陷入困境),这将更加痛苦。

我的困惑是我应该熟悉 NASM 还是 MASM?我是 Windows 的粉丝,但我可能(将来)也必须在 Linux 上工作。

每本书的标题都应该是“_________Assembly Language using __________ Assembler”

【问题讨论】:

  • 出于好奇,您将使用汇编语言做什么?您是打算为硬件制造商工作,还是为了更广泛的教育目的而学习它? (我对汇编语言及其相关职业知之甚少)
  • 是的,我是一名电子专家,并计划加入一家硬件制造商公司。我也是一名高级程序员,想了解事情的运作方式。所以,它对我都有帮助:)
  • @claws:鉴于您的评论和背景,您可能想查看 GNU 汇编器。我怀疑随着时间的推移,你会处理更多的 x86 处理器......我使用 GNU 汇编器来处理 ARM、MIPS、Nios2、Sparc、x86 等。
  • 谢谢你,理查德。我肯定会熟悉 GAS,但我使用的书籍要么使用 NASM,要么使用 MASM。所以,在我完成学习之前,我至少需要坚持其中任何一个。如果您知道任何遵循 GAS 的书。请提出建议。
  • grc.com/smgassembly.htm有一些资源链接

标签: nasm masm assembly


【解决方案1】:

处理器都记录在制造商提供的参考手册中。这通常发展成为特定平台上汇编程序的规范语法(以及供应商提供的汇编程序)。因此,来自单一供应商的许多处理器具有相似的语法。

随着处理器的二次采购和多目标汇编器的最终开发,情况变得更加复杂,由于历史原因,这些汇编器在所有平台上使用基本一致的语法。在跨平台移植代码时,这也提供了一些有争议的优势。

您最好的选择是:选择您熟悉的符号并接受具有不同语法的书籍,看看您是否可以找到跨系统的宏库或翻译工具,或者咬紧牙关学习多种方言。第三种通常是可以忍受的,尽管它会使建立私人图书馆的劳动密集。

【讨论】:

    【解决方案2】:

    英特尔语法/AT&T 语法

    特别是对于 x86,第一批汇编器来自英特尔,然后来自微软的大部分兼容的汇编器形成了一个分支。

    这些汇编器从右到左组织源操作数和目标操作数,并有一个不寻常的(在我看来,有点古怪)抽象层,它使用单个助记符来处理 8、16 和 32 位操作,然后派生出实际的机器根据操作数的属性使用的操作码。存在修饰符(在操作数上)以强制特定大小。

    但 Unix 也很重要,它有一条完全不同的汇编线,有着不同的传统和约定。

    最初的 Unix 供应商是 AT&T,它拥有贝尔实验室开发的知识产权。一系列 BSD 项目和随后的 Linux 延续了这一传统。这些汇编器历来从左到右处理操作数,具有针对速度优化的备用设计,并且当人类使用时,它们通常将 cpp 用于宏和条件,即使汇编器也具有并行功能。

    如今,您可能在 MS 上使用 VS,或者在 Linux 或 Mac 上使用 Gnu,但这就是为什么我们仍然说 AT&T 与 Intel。 GNU 汇编器可以选择两种方式进行汇编,尽管它仍然属于 AT&T 阵营。

    【讨论】:

      【解决方案3】:

      通常是的。虽然它们大多是功能兼容的,所以如果你都知道的话,从一种汇编语法转换成另一种语法通常不是很困难。

      【讨论】:

        【解决方案4】:

        不幸的是,汇编语言从来没有一个标准。你只需要学习你的汇编器支持的指令。幸运的是,大多数指令虽然名称不同,但在语义上类似于 db 和 BYTE。

        但是等等!它变得更糟,尤其是对于 x86。您有(至少)两种汇编程序可以接受的代码形式:Intel 和 AT&T 格式。 AT&T 格式将大多数操作数的顺序反转为指令(或者反之亦然 ;-)。

        NASM 可能是可移植性更好的选择,但您也可以查看 GNU 汇编程序..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-07
          • 2011-05-03
          • 1970-01-01
          • 2016-09-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多