Pregunta

Tendrá que disculparme, soy nuevo en el ensamblaje x86 y en el ensamblado en general.

Así que mi pregunta es, tengo algo como:

addl %edx,(%eax)

% eax es un registro que contiene un puntero a algún 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 almacenaría el resultado de % edx + (% eax) en * xp ? ¡Realmente me encantaría que alguien me explicara esto!

¡Realmente aprecio cualquier ayuda!

¿Fue útil?

Solución

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 & amp; T (utilizada aquí), el destino es siempre 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 significan los paréntesis en la sintaxis AT & amp; T (como corchetes en la sintaxis 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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top