Почему syscall компилируется в 32-разрядном выходе NASM, а popa не компилируется в 64 бит?

Руководство Intel говорит, что:

  • инструкция syscall неверна для режима совместимости (32-разрядная версия)
  • popa недействителен для 64-разрядного режима

Так есть причина, по которой NASM:

  • дает ошибку компиляции instruction not supported in 64-bit mode, если я использую popa с -f elf64
  • не дает ошибку компиляции, если я использую syscall с -f elf32. Если я запустил исполняемый файл, я получаю Illegal instruction (core dumped), как и ожидалось.

Зачем обрабатывать эти два случая по-разному?

Протестировано с версией NASM версии 2.10.09 на Ubuntu 14.04 (должно быть неактивным).

Ответ 1

Потому что инструкция syscall существует (и работает) на процессорах AMD в 32-разрядном режиме. Исторически сложилось, что Intel использовала инструкцию sysenter, но когда AMD придумала расширение с 64-разрядным расширением, они использовали свой собственный syscall, и поэтому, когда Intel взяла на себя расширения, они также начали поддерживать syscall, но только в 64 бит режим.