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

Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
- - Dernière réponse : BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
- 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.
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
3
Merci
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++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 145 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
3
Merci
OUPS,
64 bits:
RAX, RCX, RDX, R8, R9, R10, R11.

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 145 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
3
Merci
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 !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 145 internautes nous ont dit merci ce mois-ci

Commenter la réponse de rebixav
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
0
Merci
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 ?!
Commenter la réponse de rebixav
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
552
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
1
0
Merci
liste des registres a sauvegardés sous peine de plantage:
monproc PROC uses esi edi ebx param:DWORD;
ret
monproc ENDP
Commenter la réponse de ToutEnMasm
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
0
Merci
j'ai pas compris "TM" ?
à quoi sert "uses", à sauver les registres !
au lieu de push et pop
Commenter la réponse de rebixav
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
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++
Commenter la réponse de BruNews