assembly x86 addressing-mode

assembly - Significado de(% eax) en la sintaxis de AT & T?



x86 addressing-mode (1)

Tendrás que disculparme, soy nuevo para el ensamblaje x86 y para el montaje en general.

Entonces mi pregunta es, tengo algo así como:

addl %edx,(%eax)

% eax es un registro que contiene un puntero a un entero. Vamos a llamarlo xp

¿Esto significa que está diciendo: *xp = *xp + %edx ? ( %edx es un número entero)

Estoy confundido donde addl almacenará el resultado. Si %eax es un puntero a un int, entonces (%eax) debería ser el valor real de ese int. Entonces, addl almacenaría el resultado de %edx+(%eax) en *xp ? ¡Realmente me encantaría que alguien me explique esto!

¡Realmente aprecio cualquier ayuda!


Sí, esta instrucción está haciendo exactamente lo que crees que está haciendo.

La mayoría de las instrucciones aritméticas x86 toman dos operandos: una fuente y un destino. En la sintaxis de AT & T (utilizada aquí), el destino siempre es el operando correcto. Entonces con una instrucción como:

addl %edx, %eax

los valores en edx y eax se suman y el resultado se almacena en eax . Sin embargo, en su ejemplo, (%eax) es un operando de memoria; eso es lo que significa paréntesis en la sintaxis de AT & T (como corchetes en la sintaxis de NASM).

Esto significa que eax se trata como un puntero, por lo que el operando correcto se toma de la dirección señalada por eax , y el resultado se almacena en la misma dirección.