assembly - registers - lenguaje ensamblador x86
¿Qué significa MOV EAX, DWORD PTR DS:[ESI] y qué hace? (1)
Los registros entre corchetes como [ESI]
son punteros desreferenciados. La instrucción que cita mueve el DWORD
(un valor de 32 bits / 4 bytes) en la ubicación de memoria especificada por ESI
en el registro de EAX
. En su caso, la ubicación de memoria 00402050
, leída como DWORD
, contiene 34333231
.
Escrito en pseudo-C:
DWORD EAX; /* Declaring the registers as we find them in silico */
DWORD ESI;
ESI = 0x00402050; /* Set up your initial conditions for ESI */
EAX = *((DWORD *)ESI); /* mov EAX, DWORD PTR [ESI] */
/* ^ ^ ^^^^^^^ */
/* | | | */
/* | | +----------- From "DWORD PTR" we get "DWORD *" in C. */
/* | | */
/* | +----------------- The C dereferencing operator * replaces []. */
/* | */
/* +------------------- The C assignment operator = replaces mov opcode. */
En su caso, no es verdad que 0x00402050
"es igual" a la cadena "1234567890"
, sino que apunta a la memoria que contiene esa cadena.
El valor que obtiene, 0x34333231
se compone de los valores ASCII para los dígitos "1234"
, que son los primeros cuatro bytes (es decir, el primer DWORD
) de la cadena. Aparecen en orden inverso porque la arquitectura de Intel es "little endian" en la representación de byte de un DWORD
en la memoria.
En su ejemplo en este momento, la instrucción mov
está cargando caracteres ASCII como si fueran los cuatro bytes de un valor unsigned long
, cuando en realidad son una cadena de caracteres de un solo byte.
De acuerdo, tengo esta línea en mi ensamblaje
MOV EAX, DWORD PTR DS:[ESI]
donde ESI es 00402050
(ascii, "123456789012")
Después de esta instrucción: EAX = 34333231
¿Qué pasó realmente aquí? ¿Cómo se calcula este valor y por qué?
¿Dónde podría obtener una buena referencia sobre este tipo de cosas?