What are the syntax differences between the NASM and MASM assemblers?
Section 2.2 of the NASM documentation is titled Quick Start for MASM Users which lists the important differences between NASM and MASM.
NASM version 2.15 added some MASM compatibility, including a %use masm
macro package. See section 6.5 masm
: MASM compatibility. Even without the macro package, ?
and DUP
work in data directives like db
, and displacement[base+index]
is allowed instead of the usual [rdi+4]
syntax which NASM used to require.
Also related, How to know if an assembly code has particular syntax (emu8086, NASM, TASM, ...)? discusses some of the syntax differences.
What an interesting question. The difference between them is, they are not compatible! But then again, nasm assemblers are not compatible amongst themselves, it seems. Learned it the hard way, while compiling libvpx. I think this single example says it all:
ml64.exe (MSVC 2019) -> throws
nasm for windows -> compiles some *.asm files, throws on some
invalid combination of opcode and operands
Huh?
yasm for windows -> works
llvm assembler (debian) -> throws:
/usr/lib/llvm-13/bin/llvm-as
https://packages.debian.org/experimental/llvm-13
yasm (debian) -> works
nasm (debian) -> works
GNU assembler -> ???
https://manpages.debian.org/experimental/binutils-common/as.1.en.html
.intel_syntax noprefix
mode use syntax that's pretty much MASM for instructions, but with directives that are specific to them. –
Related nasm -felf64 foo.asm
should work the same way no matter what host you're building on. If you have some asm files that assemble on Linux but not Windows, it's probably because of building with different bitness (e.g. nasm -fwin32
vs. nasm -felf64
), or something about directives, or possibly the .asm uses %if
conditional stuff an does something different on Windows.) Without an example of the instructions, it's not useful to say that NASM on windows errors. What, on every file in general? No, of course not. –
Related © 2022 - 2024 — McMap. All rights reserved.