与气体组装时推送的指令后缀无效

当用GNU汇编程序汇编文件时,出现以下错误:

hello.s:6:错误:无效的指令后缀'推'

这是我正在试图组装的文件:

.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 

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

问题与这个问题有些相关,尽pipe问题中的错误和指示是不同的。

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 

.code32作为您的第一行。

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

你正在装配一个64位汇编器吗? 你的代码看起来像是32位的。 当使用64位汇编器时,我的代码出现这个错误:

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

但是对于一个32位汇编器来说,它工作正常。

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