NASM和MASM汇编器之间的语法差异有哪些?
NASM文档的第2.2节标题为面向MASM用户的快速入门,列出了NASM和MASM之间的重要差异。
NASM 2.15版本添加了一些MASM兼容性,包括%use masm
宏包。请参见第6.5节masm
: MASM兼容性。即使没有宏包,在数据指令中像db
这样的指令中也可以使用?
和DUP
,并且允许使用displacement[base+index]
而不是NASM以前需要的[rdi+4]
语法。
此外,如何知道汇编代码是否具有特定语法(emu8086、NASM、TASM等)?讨论了一些语法差异。
这是一个非常有趣的问题。它们之间的区别在于,它们不兼容!但是,似乎nasm汇编器本身也不兼容。我在编译libvpx时吃了亏,才明白这一点。我认为这个例子已经说明了一切:
ml64.exe(MSVC 2019)-> 报错
Windows版nasm -> 编译某些*.asm文件,但对某些文件报错
invalid combination of opcode and operands
什么?
yasm适用于Windows -> 可以使用
LLVM汇编器(Debian) -> 报错:
/usr/lib/llvm-13/bin/llvm-as
https://packages.debian.org/experimental/llvm-13
yasm(Debian)-> 可用
nasm(Debian)-> 可用
GNU汇编器 -> ???
https://manpages.debian.org/experimental/binutils-common/as.1.en.html
.intel_syntax noprefix
模式下,GAS / llvm-as使用几乎与MASM相同的指令语法,但具有特定于它们的指令。 - Peter Cordesnasm -felf64 foo.asm
不管在哪个主机上构建,都应该工作。如果您有一些 asm 文件在 Linux 上汇编但在 Windows 上却不行,那很可能是由于使用了不同的位数进行构建(例如 nasm -fwin32
vs. nasm -felf64
),或者与指令相关的问题,或者 .asm
使用了 %if
条件语句,在 Windows 上执行某些不同的操作。如果没有指令示例,仅仅说在 Windows 上的 NASM 就会出错并没有太大帮助。总之,不是每个文件都会出现这种问题。 - Peter Cordes