5

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

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

分贝 110101b

在 MASM 我正在​​使用

字节 110101b

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

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

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

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

4

4 回答 4

4

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

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

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

于 2010-01-03T16:51:26.123 回答
2

英特尔语法 / AT&T 语法

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

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

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

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

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

于 2010-01-03T17:49:09.127 回答
1

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

于 2010-01-03T16:51:46.083 回答
1

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

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

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

于 2010-01-03T17:12:48.990 回答