MASM/NASM的区别

56

NASM和MASM汇编器之间的语法差异有哪些?


1
相关:如何知道汇编代码是否具有特定语法(emu8086,NASM,TASM等)?展示了一些语法差异的例子。 - Peter Cordes
2个回答

56

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等)?讨论了一些语法差异。


6
该部分中提到:“NASM区分大小写”,然而,MASM也可以区分大小写,只需使用选项“casemap:none”。 - user6763144

-3

这是一个非常有趣的问题。它们之间的区别在于,它们不兼容!但是,似乎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


2
.intel_syntax noprefix模式下,GAS / llvm-as使用几乎与MASM相同的指令语法,但具有特定于它们的指令。 - Peter Cordes
2
nasm -felf64 foo.asm 不管在哪个主机上构建,都应该工作。如果您有一些 asm 文件在 Linux 上汇编但在 Windows 上却不行,那很可能是由于使用了不同的位数进行构建(例如 nasm -fwin32 vs. nasm -felf64),或者与指令相关的问题,或者 .asm 使用了 %if 条件语句,在 Windows 上执行某些不同的操作。如果没有指令示例,仅仅说在 Windows 上的 NASM 就会出错并没有太大帮助。总之,不是每个文件都会出现这种问题。 - Peter Cordes

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