汇编语言也是与汇编器有关的吗?哪个汇编器最好?

5
我正在学习汇编语言。我开始阅读 Paul A. Carter 的《PC Assembly Language》,该书使用 NASM(Netwide Assembler)。然后在中途我切换到阅读《80×86 汇编语言和计算机体系结构介绍》,该书使用 MASM。
在 NASM 中,我曾经写过一个初始化字节的例子:

db 110101b

在 MASM 中,我现在使用:

BYTE 110101b

由于这些是汇编指令,它们对于每个汇编器都会有所不同,对吗?这些汇编器开发人员是否遵循这些指令的标准?因为他们知道助记符是特定于 CPU 的。因此,在学习和编写汇编语言时非常麻烦。
如果它们遵循不同的指令,那么如果您更改汇编器或操作系统,则会更加麻烦(如果 MASM 开发人员转到 Linux,则会陷入麻烦)。
我的困惑是,我应该熟悉 NASM 还是 MASM?我是 Windows 的粉丝,但也许将来我也需要在 Linux 上工作。
每本书都应该以“_________ 汇编语言使用 __________ 汇编器”为标题。

出于好奇,您将使用汇编语言做什么?您是计划为硬件制造商工作,还是为了更广泛的教育目的而学习它?(我对汇编语言及其相关职业知之甚少) - orokusaki
是的,我是一名电子工程师,计划加入一家硬件制造公司。我也是一名高级程序员,想要了解事物是如何运作的。所以,这对我来说有双重好处 :) - claws
@claws:考虑到你的评论和背景,你可能需要看一下GNU汇编器。我猜你以后会处理更多的不止x86处理器...我使用GNU汇编器来处理ARM、MIPS、Nios2、Sparc、x86和其他处理器。 - Richard Pennington
谢谢你,Richard。我肯定会熟悉GAS,但我所拥有的书籍要么使用NASM,要么使用MASM。因此,在我学习完成之前,我需要坚持至少其中一种。如果您知道任何遵循GAS的书籍,请建议。 - claws
在http://www.grc.com/smgassembly.htm上有一些资源链接。 - TrueWill
有一本关于Gas的书:http://savannah.nongnu.org/projects/pgubook/。但是个人而言,我不喜欢使用Gas,原因在这篇文章中提到:http://x86asm.net/articles/what-i-dislike-about-gas/index.html。 - Bastien Léonard
4个回答

4

很遗憾,汇编语言从未有过标准。您只需要学习您的汇编器支持的指令。幸运的是,大多数指令虽然名称不同,但在语义上相似,例如db和BYTE。

但等等!对于x86来说,情况变得更糟,因为至少有两种形式的代码可以被汇编器接受:Intel和AT&T格式。 AT&T格式反转了大多数操作数的顺序(或者是相反的)。

NASM可能是可移植性更好的选择,但您也可以看看GNU汇编器。


2

Intel语法/AT&T语法

特别是在x86中,最初的汇编器来自Intel,然后微软的大部分兼容汇编器形成了一支。

这些汇编器将源操作数和目标操作数从右往左组织,并具有一个不寻常的(并且在我的眼中有点疯狂)抽象层,使用一个单一的助记符用于8、16和32位操作,然后根据操作数的属性派生要使用的实际机器操作码。修饰符存在(在操作数上)以强制使用特定大小。

但是Unix也很重要,它具有完全不同的汇编线,具有不同的传统和惯例。

原始的Unix供应商是AT&T,拥有贝尔实验室开发的知识产权。一系列的BSD项目,然后Linux继续延续这一传统。这些汇编器历史上从左到右处理操作数,具有优化速度的简洁设计,当人类使用时,通常使用cpp进行宏和条件,即使汇编器也具有并行特性。

现在你可能正在使用MS上的VS或Linux或Mac上的Gnu,但这就是为什么我们仍然说AT&T vs Intel。GNU汇编器有一个选项可以以两种方式进行汇编,尽管它仍然真正属于AT&T阵营。


1

一般来说是的。它们大多数都具有相似的功能,因此如果您了解两者,从一种汇编语法转换到另一种通常不会太困难。


1
处理器都有制造商提供的参考手册进行文档化。这通常会发展成为规范语法(以及供应商提供的汇编程序)在特定平台上进行汇编程序的标准语法。因此,来自单个供应商的许多处理器具有类似的语法。
随着处理器的二次供应和最终开发出多目标汇编程序,情况变得更加复杂。由于历史原因,这些汇编程序在所有平台上使用大致一致的语法。这在跨平台移植代码时也提供了一些争议性的优势。
您最好的选择是:选择您熟悉的符号,并接受具有不同语法的书籍,查看是否可以找到跨系统宏库或翻译工具,或者咬紧牙关学习多种方言。第三种方法通常是可以容忍的,尽管它使构建私有库变得费力。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接