2009-03-27 35 views
15

En lenguaje ensamblador si utilizamosDWORD uso ptr confusión

mov eax, dword ptr[ebx] 

entonces significa copiar el valor señalado por EBX (EBX contiene el valor de la dirección, no el valor real, esta instrucción copia el valor real en la dirección)?

Si utilizamos

mov eax, dword ptr[some_variable] 

entonces significa copiar el valor de la variable "some_variable" sí a EAX, no copia el valor apuntado por la variable "some_variable"?

¿Es correcto mi entendimiento?

En caso afirmativo, no estoy seguro de por qué la misma instrucción de ensamblaje tiene dos maneras diferentes: en el primer caso, hay un nivel de indirección, pero en el segundo no hay un nivel adicional de indirección.

¿Alguna observación?

EDIT:

No todos [] no teniendo ningún efecto, por ejemplo, xchg instrucción se llevará a un nivel de in-dirección, que carga el valor señalado por EDX.

código fuente entero se puede conocer a partir,

http://www.codeproject.com/KB/threads/spinlocks.aspx

#ifdef WIN32 
inline int CPP_SpinLock::TestAndSet(int* targetAddress, int nValue) 
{ 
    __asm { 
     mov edx, dword ptr [pTargetAddress] 
     mov eax, nValue 
     lock xchg eax, dword ptr [edx] 
    } 
} 
#endif // WIN32 

Respuesta

12

En ambos casos le pide al procesador para mover el valor de una dirección especificada. Es un nivel de indirección. En el primer caso, solicite que tome la dirección de un registro específico. En el segundo caso, especifica un desplazamiento directamente.

Los procesadores x86 no son compatibles con la indirección de dos niveles, por lo que no es posible solicitar cargar un valor desde una dirección especificada en algún lugar de la memoria; debe cargar la dirección en un registro.

Bajo una serie de montadores (MASM y construido en ensamblador VC++, por ejemplo) se podría escribir así simplemente

mov eax, dword ptr some_variable 

sin corchetes, que significaría la misma.

Se puede escribir

move eax, dword ptr [variable][ebx] 

esto daría instrucciones para tomar la dirección de "variable", a continuación, agregar valor de EBX y utilizar la suma como una dirección desde la que cargar un valor. Esto se usa a menudo para acceder a los elementos de la matriz por índice.

En todos estos casos, el procesador haría lo mismo: cargar un valor desde una dirección especificada. Es un nivel de indirección cada vez.

+1

"sin corchetes, significaría lo mismo". - eso depende del ensamblador utilizado. MASM permite esto, nasm/yasm/fasm no (y con razón, usted * está * haciendo indirección cuando lee una variable, lo mejor es ser explícito al respecto. De eso se trata el montaje, ¿no?) – snemarch

+0

Sí, claro. Una comprensión errónea a menudo equivale a una depuración a largo plazo. – sharptooth

+0

Hola sharptooth, si agrega [] y sin agregar [], los efectos son los mismos, ¿por qué las personas escribirán adicional []? Creo que la mayoría de los desarrolladores son flojos.:-) – George2