linux - tag - Sufijo de instrucción no válido para empujar al ensamblar con gas
puddletag (4)
Al ensamblar un archivo con el ensamblador GNU obtengo el siguiente error:
hola.s: 6: Error: sufijo de instrucción no válida para ''empujar''
Aquí está el archivo que estoy tratando de armar:
.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
¿Qué está mal aquí y cómo lo arreglo?
El problema está algo relacionado con esta pregunta, aunque los errores y las instrucciones en las preguntas son diferentes.
¿Está ensamblando con un ensamblador de 64 bits? Su código parece que es de 32 bits. Recibo este error con su código cuando uso un ensamblador de 64 bits:
example.s:6:suffix or operands invalid for `push''
Pero funciona bien con un ensamblador de 32 bits.
Debe usar una "sintaxis de 64 bits", o puede usar la opción "--32": de esta manera, el ensamblador cambia su objetivo a la plataforma i386.
Instrucciones de 64 bits
Por defecto, la mayoría de las operaciones siguen siendo de 32 bits y las contrapartes de 64 bits son invocadas por el cuarto bit en el prefijo REX. Esto significa que cada instrucción de 32 bits tiene su extensión natural de 64 bits y que los registros extendidos son gratuitos en instrucciones de 64 bits.
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
como tu primera línea.
--32
opción --32
cambiará el destino a la plataforma de 32 bits.