1

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 use popa with -f elf64
  • does not give give a compilation error if I use syscall with -f elf32. If I run the executable I get Illegal 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).

Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985

1 Answers1

3

Because the syscall instruction exists (and works) on AMD processors in 32 bit mode too. Historically, Intel used the sysenter instruction, but when AMD came up with the 64 bit extension, they used their own syscall and so when Intel took over the extensions, they also started supporting syscall, but only in 64 bit mode.

Jester
  • 56,577
  • 4
  • 81
  • 125
  • I was too naive to think that Intel and AMD would be compatible :-) Accepting since the AMD manuals say that `popa` is illegal in 64-bit and say nothing about `syscall` being illegal in compat mode. – Ciro Santilli OurBigBook.com Apr 22 '15 at 10:14
  • I have asked if there is a good way to find out the compatible subset at: http://stackoverflow.com/questions/29833938/what-is-the-compatible-subset-of-intels-and-amds-x86-64-implementations – Ciro Santilli OurBigBook.com Apr 23 '15 at 21:10