Qu'elles sont les registre à sauvegarder sous windows avant de les modifier ?

Résolu
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013 - 24 nov. 2012 à 19:55
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

9 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 nov. 2012 à 20:16
Liste des ecrasables (TOUS autres a restituer):
32 bits:
EAX, ECX, EDX.
64 bits:
EAX, ECX, EDX, R8, R9, R10, R11.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 nov. 2012 à 20:18
OUPS,
64 bits:
RAX, RCX, RDX, R8, R9, R10, R11.

ciao...
BruNews, MVP VC++
3
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
25 nov. 2012 à 18:27
super j'ai encore gagné un petite virgule en vitesse
mais je préfère écrire comme cela :

PEEK8 PROC EXPORT ADRESSE_SOURCE:DWORD
mov edx,adresse_source
movzx eax,byte ptr[edx]
ret
PEEK8 ENDP

que comme cela :

PEEK8 PROC
mov edx, [esp + 4] ; TON PARAM
movzx eax, byte ptr[edx]
ret 4
PEEK8 ENDP

c'est plus clair, et j'ai eu beau faire des test, j'ai pas eu de différence de vitesse !
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 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 ?!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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

ciao...
BruNews, MVP VC++
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
26 nov. 2012 à 14:44
liste des registres a sauvegardés sous peine de plantage:
monproc PROC uses esi edi ebx param:DWORD;
ret
monproc ENDP
0
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
2 déc. 2012 à 07:24
j'ai pas compris "TM" ?
à quoi sert "uses", à sauver les registres !
au lieu de push et pop
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous