Подтвердить что ты не робот

Недопустимый суффикс инструкции для толчка при сборке с газом

При сборке файла с помощью ассемблера 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

Что здесь не так и как это исправить?

Проблема несколько связана с этим вопросом, хотя ошибки и инструкции в вопросах разные.

4b9b3361

Ответ 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.