Недопустимый суффикс инструкции для толчка при сборке с газом
При сборке файла с помощью ассемблера GNU я получаю следующую ошибку:
hello.s: 6: Ошибка: недопустимый суффикс команды для `push '
Вот файл, который я пытаюсь собрать:
.text
LC0:
.ascii "Hello, world!\12\0"
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
call __alloca
call ___main
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
Что здесь не так и как это исправить?
Проблема несколько связана с этим вопросом, хотя ошибки и инструкции в вопросах разные.
Ответы
Ответ 1
64-битные инструкции
По умолчанию большинство операций остаются 32-битными, а 64-разрядные экземпляры вызывают четвертый бит префикса REX. Это означает, что каждая 32-разрядная команда имеет естественное 64-битное расширение и что расширенные регистры бесплатны в 64-битных инструкциях
movl $1, %eax # 32-bit instruction
movq $1, %rax # 64-bit instruction
pushl %eax # Illegal instruction
pushq %rax # 1 byte instruction encoded as pushl %eax in 32 bits
pushq %r10 # 2 byte instruction encoded as pushl preceeded by REX
Ответ 2
Подготовьте .code32
в качестве первой строки.
Опция --32
изменит цель на 32-битную платформу.
Ответ 3
Собираетесь ли вы с 64-битным ассемблером? Ваш код выглядит как 32-битный. Я получаю эту ошибку с вашим кодом при использовании 64-разрядного ассемблера:
example.s:6:suffix or operands invalid for `push'
Но он отлично работает с 32-разрядным ассемблером.
Ответ 4
Вы должны использовать "64-битный синтаксис", или вы можете использовать опцию "-32": таким образом ассемблер преследует свою цель на платформе i386.