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.