Qu'elles sont les registre à sauvegarder sous windows avant de les modifier ? [Résolu]

Signaler
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
-
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
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++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
OUPS,
64 bits:
RAX, RCX, RDX, R8, R9, R10, R11.

ciao...
BruNews, MVP VC++
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013

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 !
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
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++
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013

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 ?!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
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++
Messages postés
552
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
1
liste des registres a sauvegardés sous peine de plantage:
monproc PROC uses esi edi ebx param:DWORD;
ret
monproc ENDP
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013

j'ai pas compris "TM" ?
à quoi sert "uses", à sauver les registres !
au lieu de push et pop
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
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++