assembler and assembly x86 att

assembly - and - ¿Qué representan los signos de dólar($) y porcentaje(%) en el ensamblaje x86?



gnu assembler (5)

Como dijo @Necrolis, eso está escrito en la sintaxis de AT&T. Significa:

subtract 48 from the register esp (the stack pointer). store the contents of eax to the four bytes starting at (esp + 32).

Estoy tratando de entender cómo funciona el lenguaje ensamblador para una clase de arquitectura de microordenador, y sigo enfrentando diferentes sintaxis en ejemplos:

sub $48, %esp mov %eax, 32(%esp)

¿Qué significan estos códigos? ¿Qué es el 32 operando una adición al registro esp?


En comparación con la sintaxis de Intel, la sintaxis de AT&T tiene muchas diferencias

  • $ significa una constante (entero literal). Sin ella el número es una dirección absoluta.
  • % denota un registro
  • El orden de origen / destino se invierte
  • () se utiliza para referencia de memoria, como [] en la sintaxis Intel

Así que el fragmento anterior es equivalente a

sub esp, 48 ; esp -= 48 mov [esp+32], eax ; store eax to the value at the address `esp + 32`


Esa no es la sintaxis de Intel, su sintaxis de AT&T , también llamada sintaxis de GAS .

El prefijo $ es para los inmediatos (constantes), y el prefijo % es para los registros (se requieren 1 ).

Para obtener más información sobre la sintaxis de AT&T, consulte también la etiqueta wiki [att] .

1 A menos que se especifique la opción noprefix , consulte here y here . Pero normalmente noprefix solo se usa con .intel_syntax noprefix , para obtener una sintaxis similar a MASM.


Esta es la sintaxis de AT&T para x86. En AT&T, el % generalmente denota un registro, mientras que $ está reservado para los inmediatos. Si omite th $ el ensamblador interpretaría el 48 como una dirección.


Sí, "32 (% esp)" indica un desplazamiento de 32 desde% esp.