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

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

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

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


person vitaut    schedule 07.06.2011    source источник
comment
возможный дубликат x86 Assembly pushl/popl не работает   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 10.05.2015


Ответы (4)


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
person Anu    schedule 23.06.2011

Добавьте .code32 в качестве первой строки.

--32 изменит цель на 32-битную платформу.

person Xiao Jia    schedule 30.11.2012
comment
Как именно я использую это? - person Ben; 21.12.2020

Вы ассемблируете на 64-битном ассемблере? Ваш код выглядит как 32-битный. Я получаю эту ошибку с вашим кодом при использовании 64-битного ассемблера:

example.s:6:suffix or operands invalid for `push'

Но он отлично работает с 32-битным ассемблером.

person Carl Norum    schedule 07.06.2011

Вы должны использовать «64-битный синтаксис», или вы можете использовать опцию «-32»: таким образом ассемблер изменяет свою цель на платформу i386.

person rem    schedule 20.07.2011