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?
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.