当谈论“AT&T语法”与“Intel语法”时,通常仅指指令助记符和操作数排序和格式之间的差异。
例如,这是一条 AT&T 语法指令:
movl $1, (%esi)
这是使用 Intel 语法的相同指令:
mov DWORD PTR [esi], 1
对于以 Intel 语法表示的每条指令,该指令在 AT&T 语法中都有等效的表示形式。
由于不再有 AT&T 汇编器和 Intel 汇编器,因此指令(除指令之外的所有内容)是另一回事。 GNU 汇编器 (GAS) 支持 AT&T 和 Intel 语法,但仅支持其自己的指令,这些指令是 AT&T 汇编器使用的指令的扩展。 Microsoft 的 MASM 仅支持 Intel 语法,也仅支持其自己的指令,这些指令是原始 Intel 汇编器的扩展。一个汇编器的指令与另一汇编器的指令并不总是直接等效。在某些情况下,它们使用不同的目标文件格式这一事实可能会妨碍找到使用不同目标文件格式在不同汇编器中实现指令功能的任何方法。 (或者甚至使用不同格式的相同汇编器,就像 GNU 汇编器的情况一样。)
作为示例,以下是一些 GAS 指令:
.rept 3
.byte 0x90, 0x8D, 0x40, 0x00
.endr
以下是等效的 MASM 指令:
REPT 3
DB 90h, 8Dh, 40h, 00h
ENDM
但是没有与以下 GAS 指令等效的 MASM,因为它特定于 ELF 对象格式,而 MASM 不支持这种格式:
.protected foo
另一方面,没有与以下 MASM 指令直接等效的指令,因为 GAS 不支持任何复杂的高级语言指令:
INVOKE HeapAlloc,EAX,HEAP_GENERATE_EXCEPTIONS+HEAP_ZERO_MEMORY+HEAP_CREATE_ALIGN_16,4194332
要移植以前的 ELF 特定指令,您必须重新设计应用程序以处理 Windows 处理共享库的方式。要移植后来的 MASM 特定指令,您要么必须创建自己的宏来完成弄清楚如何正确传递所有参数的工作,要么只是根据以下命令手动写出此调用所需的所有汇编指令: Linux x86-64 ABI。 (您还必须找到一个合适的 Linux 函数来调用和传递一组不同的参数,但这与翻译指令本身是一个单独的问题。)
一些汇编器尝试与其他汇编器兼容;例如,Borland 的 TASM 尝试与 MASM 兼容,尽管它是 MASM 的旧版本。因此,在 TASM(默认的 MASM 模式)中有效的内容通常在 MASM 中也能有效,反之亦然。然而,许多汇编程序本质上使用它们自己的 x86 汇编语言版本。
例如,您在帖子中显示的代码似乎使用两种不同的汇编语言版本,并且无法由任何单个汇编器进行汇编。您的第一行代码使用TIMES
指令,但该指令仅受 NASM 支持,NASM 不使用 AT&T 语法,也不使用 Intel 语法。它有自己的指令语法,尽管它与英特尔语法没有太大不同。它也有自己的不兼容的指令集,不基于任何特定的东西,就像这样TIMES
你展示的指令。
其余代码似乎采用 MASM 语法。除了第三行之外,它无法使用 NASM 正确组装(第一行也无法使用 MASM 正确组装)。我也不确定是否会与 TASM 组装,因为INVOKE
MASM 6 中添加了指令。
请注意,考虑到代码的性质,用汇编语言编写它可能没有任何好处,并且将其翻译成 C、C++ 或您更熟悉的其他语言可能会更好。