tagger tag puddletag mp3tag kid3 editar linux compiler-errors assembly gas

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.