2009-10-24 24 views
26

Tendrás que disculparme, soy nuevo para el ensamblaje x86 y el montaje en general.Significado de (% eax) en la sintaxis de AT & T?

Así que mi pregunta es, tengo algo como:

addl %edx,(%eax) 

% eax es un registro que contiene un puntero a un entero. Llamémoslo 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) debe ser el valor real de ese int. Entonces, ¿addl almacena el resultado de %edx+(%eax) en *xp? ¡Realmente me encantaría que alguien me explique esto!

Realmente aprecio cualquier ayuda!

Respuesta

50

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

La mayoría de las instrucciones aritméticas x86 toman dos operandos: una fuente y un destino. En AT & sintaxis T (utilizada aquí), el destino siempre es el operando correcto. Así que 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 AT & sintaxis T (como corchetes en sintaxis NASM).

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

+0

+1 buena respuesta simple. –

+0

'(% eax)' es "registrar indirectamente", si desea [nombrar diferentes modos de direccionamiento] (https://stackoverflow.com/questions/46257018/do-terms-like-direct-indirect-addressing-mode- actual-existe-en-el-intel-x86-hombre) en absoluto. El direccionamiento "indirecto de la memoria" se produce cuando la CPU carga una dirección de la memoria y luego realiza una desreferencia * que * (x86 no admite el direccionamiento indirecto de la memoria). https://en.wikipedia.org/wiki/Addressing_mode#Memory_indirect –

Cuestiones relacionadas