Code machine et bits de déplacement
Hello,
Je m'attaque un peu à la compréhension de la conversion ASM -> Code machine... Et j'ai justement un petit soucis de compréhension sur la manière dont sont représentés les bits de déplacement.
Dans mon exemple, j'ai une simple fonction on ne peut plus basique correspondant au code C suivant :
Code:
1 2 3 4 5 6
|
int test()
{
int a = 42;
return a;
} |
Ce qui donne ceci une fois compilé par Visual Studio et après visualisation de l'assembleur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| int test()
{
55 push ebp
8B EC mov ebp,esp
81 EC CC 00 00 00 sub esp,0CCh
53 push ebx
56 push esi
57 push edi
8D BD 34 FF FF FF lea edi,[ebp-0CCh]
B9 33 00 00 00 mov ecx,33h
B8 CC CC CC CC mov eax,0CCCCCCCCh
F3 AB rep stos dword ptr es:[edi]
int a = 42;
C7 45 F8 2A 00 00 00 mov dword ptr [a],2Ah
return a;
8B 45 F8 mov eax,dword ptr [a]
}
5F pop edi
5E pop esi
5B pop ebx
8B E5 mov esp,ebp
5D pop ebp
C3 ret |
Ce qui me pose problème, ce sont ces lignes en particulier :
Code:
1 2
| C7 45 F8 2A 00 00 00 mov dword ptr [a],2Ah
8B 45 F8 mov eax,dword ptr [a] |
Pas de soucis pour les Opcodes C7h et 8Bh. Dans les deux cas, j'ai le ModR/M à 45h, ce qui me donne [01][000][101], m'indiquant (mauvaise interprétation ?) que les bits de déplacement seront calculés par rapport à la valeur d'EBP.
Sachant que le contexte d'exécution, une fois "a" assigné, j'ai EBP qui vaut 3'406'824d et ma variable "a" dont l'adresse est 3'406'816d, ça me fait donc une différence entre les deux de 8... Logiquement je m'attends à ce que les bits de déplacement m'indiquent donc 8, mais non, j'ai F8h, et là je ne comprends plus. Quelqu'un saurait-il m'expliquer ?
Merci à qui prendra le temps de répondre :)
[Edit] Après passage sous OllyDbg, ces lignes de code indiquent bien faire référence à [EBP-8], je ne comprends définitivement pas >_<.