Из Руководства разработчика программного обеспечения Intel® 64 и IA-32 для архитектур , 7.3.1.5 Инструкции по работе со стеком в 64-битном режиме :
В 64-битном режиме размер указателя стека составляет 64 бита и не может быть переопределен префиксом инструкции.В неявных ссылках на стек переопределения размера адреса игнорируются. В 64-битном режиме невозможно получить и вытолкнуть 32-битные значения из стека.
(выделение.)
push ebp
попыткивыдвинуть 32-битный регистр, что недопустимо в 64-битном режиме.
Это 32-битный код (и может произойти сбой в 64-битном режиме, даже если push ebp
был закодирован), поэтому вам нужно собрать его в 32-битный исполняемый файл.При использовании gcc или clang используйте
gcc -m32 -no-pie -fno-pie main.s -o my_prog
(параметры no-pie не обязательны, но вы, вероятно, хотите, чтобы они получили более простой зависимый от позиции исполняемый файл для 32-разрядного кода.)