使用气体装配时推送的指令后缀无效

时间:2011-06-07 16:49:27

标签: linux compiler-errors assembly gas

使用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

这里有什么问题,如何解决?

虽然问题中的错误和说明不同,但问题与this question有些相关。

4 个答案:

答案 0 :(得分:22)

.code32作为第一行。

--32选项会将目标更改为32位平台。

答案 1 :(得分:19)

64位指令

默认情况下,大多数操作仍为32位,并且REX前缀中的第四位调用64位对应项。这意味着每个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 :(得分:13)

您是否正在使用64位汇编程序进行汇编?你的代码看起来像是32位。使用64位汇编程序时,我的代码出现此错误:

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

但它适用于32位汇编程序。

答案 3 :(得分:8)

您必须使用“64位语法”,或者您可以使用“--32”选项:通过这种方式,汇编程序将其目标转移到i386平台。