The Intel manual says that:
- the
syscall
instruction is invalid for compatibility mode (32-bit) popa
is invalid for 64-bit mode
So is there a reason why NASM:
- gives a compilation error
instruction not supported in 64-bit mode
if I usepopa
with-f elf64
- does not give give a compilation error if I use
syscall
with-f elf32
. If I run the executable I getIllegal instruction (core dumped)
as expected.
Why treat those two cases differently?
Tested with NASM version 2.10.09 on Ubuntu 14.04 (should be OS agnostic).
Because the
syscall
instruction exists (and works) on AMD processors in 32 bit mode too. Historically, Intel used thesysenter
instruction, but when AMD came up with the 64 bit extension, they used their ownsyscall
and so when Intel took over the extensions, they also started supportingsyscall
, but only in 64 bit mode.