После этого:
push printtext
call printf
Вы хотите:
addl $4, %esp
Дальнейшее объяснение:
Поскольку вы используете x86 Linux, я предполагаю, что соглашение о вызовах требует, чтобы вызываемый объект очистил параметры. Поскольку вы нажали указатель перед вызовом printf
, ваш стек отключен на 4 после того, как эта функция ret
получила команду.
Обновление:
Да, хорошо, я привык к синтаксису Intel, поэтому я получил порядок аргументов в моей голове. На самом деле отсутствие addl
обратно в esp
не имеет значения, потому что вы правильно восстанавливаете esp
рядом с ret
. Следующее мое предположение заключается в том, что в строке, которую вы передаете printf
, отсутствует нулевой терминатор ... Дайте мне посмотреть, что делает gas
...
Обновление 2:
ОК, gas
null завершает строки для вас, поэтому я думаю, что моя вторая догадка была неправильной. Похоже, вы нашли проблему, поэтому вопрос спорный.