Ошибка: недопустимый суффикс команды для `push '

Я пытаюсь изучить переданные аргументы в функцию через стек в assmbly. я использую систему fedora 20, 64 бит.

когда я пытаюсь выполнить следующий код,

pushl% ebp

popl% ebp

я получаю ошибку,  Ошибка: недопустимый суффикс инструкции для `push '

как я могу преодолеть эту ошибку!

я скомпилировал его,  as -ggstabs -o Function_Stack.o Function_Stack.c

Ответ 1

Ошибка, которую вы получаете, получается из очень простого факта: инструкция push в 32-битном режиме принимает 16-битные и 32-битные строки в качестве аргументов. Однако команда push, используемая в 64-битном режиме, принимает только 16-битные и 64-битные операторы. Поскольку вы четко компилируете свой код как 64-битный, ассемблер выдает ошибку, поскольку он не может кодировать такую ​​инструкцию. Кроме того, имейте в виду, что вы сами вынуждаете размер операнда, добавляя суффикс l к команде push. Все, что я только что написал, точно такое же для pop, за исключением того, что оно принимает регистры/память, а не сразу.

Однако вы также нуждаетесь, чтобы иметь в виду различия в ABI между 32-битными и 64-разрядными системами Linux. ABI определяет, среди прочего, как параметры передаются функциям и как вызывать ядро ​​из приложений пользовательского режима. Ваш код явно написан для 32-битного режима, видя, как он использует стек для передачи аргументов и (очень) устаревший способ int $0x80 для вызова системных вызовов. Чтобы узнать о 64-битном ABI, см. этот документ.

Кроме того, у вас есть возможность скомпилировать 32-разрядный код в 64-разрядной системе. Такой исполняемый файл будет работать, если в вашей 64-разрядной системе установлены необходимые 32-битные библиотеки времени выполнения. Большинство дистрибутивов позволяют вам делать это по-разному. У вашего компилятора as есть переключатель --32 для испускания 32-битного кода.