Неверный суффикс инструкции для толчка при сборке с газом - PullRequest
19 голосов
/ 07 июня 2011

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

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

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

Ответы [ 4 ]

22 голосов
/ 30 ноября 2012

Prepend .code32 в качестве первой строки.Опция

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

19 голосов
/ 23 июня 2011

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
13 голосов
/ 07 июня 2011

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

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

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

8 голосов
/ 20 июля 2011

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

...