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 :
Ce qui donne ceci une fois compilé par Visual Studio et après visualisation de l'assembleur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int test() { int a = 42; return a; }
Ce qui me pose problème, ce sont ces lignes en particulier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 C7 45 F8 2A 00 00 00 mov dword ptr [a],2Ah 8B 45 F8 mov eax,dword ptr [a]
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 >_<.
Partager