Ответ 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-битного кода.