rebixav
Messages postés130Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention28 janvier 2013
-
24 nov. 2012 à 19:55
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
2 déc. 2012 à 10:39
Bonjours à tous.
j'aimerais savoir si il est indispensable de sauvegarder chaque registre que l'on veut utiliser avant!
je sais que esi et edi doivent lêtre sinon c'est le plantage assuré
mais les autres...
exemple j'utilise mes procédure dll sous VB6 et voici celle-ci :
PEEK8 PROC EXPORT ADRESSE_SOURCE:DWORD
; push esi
mov edx,esi
mov eax,0
mov esi,adresse_source
mov al,[esi]
mov esi,edx
; pop esi
ret
PEEK8 ENDP
comme vous pouvez le voir j'ai remplacer push et pop par des "mov edx", cela me permet de gagné un poil en vitesse, je sais que mov est plus rapide que push, mais de cette façons je modifie edx, sans le sauvegarder avant
j'ai fait quelque essai, cela n'as pas l'ai d'être grave, mais ce n'est que quelque essai !
si j'utilise par exemple "mov ebx", cela plante !
...
merci de me répondre, car je ne voie pas ou chercher cela.
A voir également:
Qu'elles sont les registre à sauvegarder sous windows avant de les modifier ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 24 nov. 2012 à 20:33
encore un oubli, aggrrrr
Je vois:
mov edx,esi
inutile, tu n'en fais rien.
VB6 est 32 bits, ne peut appeler que des fonctions exportees en stdcall, params sont mises sur stack par appelant. La fonction appelee (la tienne ici) doit depiler.
Exemple, si tu prends 1 param, il faut
RET 4
en sortie pour remonter ESP avant que le pointeur d'instruction ne lise l'adresse de ou continuer le prog.
Va voir sur vbfrance dans mes sources (anciennes), j'ai fait pas mal de DLLS pour VB.
ciao...
BruNews, MVP VC++
Vous n’avez pas trouvé la réponse que vous recherchez ?
rebixav
Messages postés130Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention28 janvier 2013 25 nov. 2012 à 11:00
Donc si j'ai bien compris on doit uniquement sauvegarder les registres ebx,esi, et edi, si on les modifies ?!
...
Mais tu as ecrit que l'on peut enlever les lignes :
Mov edx,esi
Mov esi,edx
Et remplacer ret par ret 4
Je suis pas chez moi, tu est sure ?!
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 25 nov. 2012 à 12:46
Si 1 param, RET 4.
mov eax, 0
serait: xor eax, eax
inutile ici
Je suppose que ta fonction a 1 param, vois comme il n'en restera pas grand chose:
PEEK8 PROC
mov edx, [esp + 4] ; TON PARAM
movzx eax, byte ptr[edx]
ret 4
PEEK8 ENDP
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 2 déc. 2012 à 10:39
Oui, c'est de la macro.
A NE JAMAIS UTILISER:
- ce n'est pas une macro qui assurera un entrelacement optimal des instructions. Meme le compilo Intel 2013 est loin d'y arriver à tout coup, alors une pauvre macro... Il n'y a qu'un cerveau qui le fera et ça risque de durer.
- c'est totalement obsolete en x64 où l'appelant doit assurer alignement et place sur la stack pour la fonction appelée.