web-dev-qa-db-fra.com

Que signifie MOV EAX, DWORD PTR DS: [ESI] et que fait-il?

Bon donc j'ai cette ligne dans mon Assemblée

MOV EAX, DWORD PTR DS:[ESI]

où ESI est 00402050 (ascii, "123456789012")

Après cette instruction: EAX = 34333231

Que s'est-il vraiment passé ici? Comment cette valeur est-elle calculée et pourquoi?
Où pourrais-je obtenir de bonnes références sur ce genre de chose?

43
zeta

Registres entre crochets tels que [ESI] sont des pointeurs déréférencés. L'instruction que vous citez déplace le DWORD (une valeur 32 bits/4 octets) dans l'emplacement mémoire spécifié par ESI dans le registre EAX. Dans votre cas, l'emplacement de la mémoire 00402050, lu comme DWORD, contient 34333231.

Écrit 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. */ 

Dans votre cas, il n'est pas vrai que 0x00402050 "est égal" à la chaîne "1234567890" - il pointe plutôt vers la mémoire qui contient cette chaîne.

La valeur que vous obtenez, 0x34333231 est composé des valeurs ASCII pour les chiffres "1234", qui sont les quatre premiers octets (c'est-à-dire le premier DWORD) de la chaîne. Ils apparaissent dans l'ordre inverse car l'architecture Intel est "peu endienne" dans la représentation en octets d'un DWORD en mémoire.

Dans votre exemple en ce moment, l'instruction mov charge ASCII caractères comme s'il s'agissait des quatre octets d'un unsigned long valeur, alors qu'il s'agit en fait d'une chaîne de caractères codés sur un octet.

68
Heath Hunnicutt