Почему 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 бит режим.