assembly - instruction - dword ptr use confusión
registers assembly x86 (1)
En lenguaje ensamblador si usamos
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 usamos
mov eax, dword ptr[some_variable]
¿Entonces significa copiar el valor de la variable "some_variable" a eax, no copiar el valor señalado por la variable "some_variable"?
¿Mi entendimiento es correcto?
Si es así, estoy confundido de por qué la misma instrucción de ensamblaje tiene dos significados diferentes: en el primer caso hay un nivel de direccionamiento indirecto, pero en el segundo no hay un nivel adicional de direccionamiento indirecto.
¿Cualquier comentario?
EDITAR:
No todos los [] no tienen ningún efecto, por ejemplo, la instrucción xchg tomará un nivel de dirección, que carga el valor señalado por edx.
Todo el código fuente se puede encontrar en,
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
En ambos casos, le pide al procesador que mueva el valor de una dirección específica. Es un nivel de indirección. En el primer caso, le pide que tome la dirección de un registro específico. En el segundo caso especificas un offset directamente.
Los procesadores x86 no admiten el direccionamiento indirecto de doble nivel, 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.
Debajo de varios ensambladores (MASM y ensamblados en VC ++ por ejemplo) también podría escribir
mov eax, dword ptr some_variable
Sin corchetes, significaría lo mismo.
Usted podría escribir
move eax, dword ptr [variable][ebx]
esto indicaría tomar la dirección de "variable", luego agregar el valor de ebx y usar la suma como una dirección desde la cual cargar un valor. Esto se utiliza a menudo para acceder a los elementos de la matriz por el índice.
En todos estos casos, el procesador haría lo mismo: cargar un valor desde una dirección específica. Es un nivel de indirección cada vez.