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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
Ce qui me pose problème, ce sont ces lignes en particulier :

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]
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 >_<.