registers instruction example eax assembler and assembly x86 dword pointers

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.