2010-07-11 77 views
30

Muy bien, así que tienen esta línea en mi ensamblaje¿Qué significa MOV EAX, DWORD PTR DS: [ESI] y qué hace?

MOV EAX, DWORD PTR DS:[ESI] 

donde ESI es 00402050 (ascii, "123456789012")

Después de esta instrucción: EAX = 34333231

Lo que realmente ha pasado aquí? ¿Cómo se calcula este valor y por qué?
¿Dónde podría obtener una buena referencia sobre este tipo de cosas?

Respuesta

54

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 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 cierto que 0x00402050 "es igual a" la cadena "1234567890" - sino que apunta a la memoria que contenga esa cadena.

El valor que se obtiene, 0x34333231 se compone de los valores ASCII para los dígitos "1234", que son los primeros cuatro bytes (es decir, la primera DWORD) de la cadena. Aparecen en orden inverso porque la arquitectura Intel es "little endian" en la representación de bytes de DWORD en la memoria. En este momento, la instrucción mov carga 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.

+32

También debe mencionar que la notación 'DS: [ESI]' significa que 'ESI' contiene una * compensación * de dirección en' DS' (registro de segmento de datos), por lo que la instrucción mueve palabra doble (valor de 32 bits) de la dirección 'DS + ESI' para registrar' EAX'. –

+13

No estoy 100% seguro de que eso sea pedagógico en esta etapa. En modo protegido, DS es un selector, no un segmento. Creo que OP está en modo protegido porque Linux, Windows y MacOS se ejecutan en modo protegido habilitado para VM y OP no parece ser un programador de sistemas integrado. Dada la situación compleja, que en realidad es muy simple (DS se asigna a todo el rango de direcciones y la base del selector es cero), ¿por qué intentar pelar esa cebolla? –

+4

@Nikolai, me alegro de que se haya mencionado aquí para una cierta 'integridad'. –

Cuestiones relacionadas