Ebx et interface C/C++

kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008 - 20 avril 2007 à 23:10
_dune2_ Messages postés 141 Date d'inscription mercredi 19 juillet 2006 Statut Membre Dernière intervention 20 avril 2011 - 24 avril 2007 à 12:12
Bonjour,

pourquoi ne pas modifier la valeur du registre %ebx dans une interface en C/C++?


En effet, j'ai code plusieurs fonctions dans des .o, que j'utilise dans
mon code C, et si je modifie %ebx, j'ai des problemes (vu egalement ce
probleme sur un tuto).

Donc pour le coup je dois le push/pull, mais j'aimerais savoir a quoi
cela est du? (j'ai lu aussi qu'il n'y avait pas ce probleme en asm pur
ou lib dynamique?).


Merci d'avance.

8 réponses

kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
21 avril 2007 à 03:17
En me relisant c'est pas tres clair.

[...]
"push ebx : ici cela n'est pas réellement utile non plus puisque ebx, on
n'y touche pas; mais c'est une question de bonnes habitudes car il est
interdit pour une fonction de modifier ebx ( quand on l'interface avec
du C/C++ tout du moins, en asm pur vous faites ce que vous voulez ) "
[...] sources : http://www.coder-studio.com/?page=tutoriaux_aff&code=asm_4

Pourquoi? merci.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 avril 2007 à 09:28
Réponse Windows, autres OS à voir:
"asm pur" qu'est-ce à dire ??? si tu écris un prog en complet asm sera idem, C/C++ produit un listing asm.
Tout OS à des specs pour developper dessus tout comme il y a des règles pour un jeu.
La 1ere règle étant pour Win32: Hors EAX, ECX et EDX, tous les registres sont à restituer dans leur état original en sortie de fonction.

ciao...
BruNews, MVP VC++
0
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
21 avril 2007 à 11:57
Pour l'asm pur je ne sais pas, mais j'ai vu quelqu'un ne pas restaurer la valeur de ebx pour une lib dynamique sous linus et "a priori" il n'y avait pas de soucis.
Apres pour ma question, en fait oui, j'imagine normal de ne pas toucher a ce qui est exterieur aux 4 registres de donnees, modifier les registres qui indique la position dans le code peut effectivement poser quelques soucis! Mais, pour ebx, je me posais la question. Pourquoi ce registre de donnee particulier ne devait pas etre touche? Que fait le system, ou le compilateur, avec ? (chez moi linux donc format elf, et gcc donc avec as et en at&t).
0
_dune2_ Messages postés 141 Date d'inscription mercredi 19 juillet 2006 Statut Membre Dernière intervention 20 avril 2011
22 avril 2007 à 19:26
Salut,

Concernant la compilation sous GNU/Linux-elf avec GCC :

La convention d'appel de fonction sur un système linux-elf est décrite sur le site suivant :
http://www.cs.umbc.edu/~chang/cs313.s02/stack.shtml

Avec la phrase suivante :
"

The convention used here is that the callee is allowed to mess up the
values of the EAX, ECX and EDX registers before returning. So, if the
caller wants to preserve the values of EAX, ECX and EDX, the caller must
explicitly save them on the stack before making the subroutine call.
On the other hand, the callee must restore the values of the EBX, ESI and
EDI registers. If the callee makes changes to these registers, the callee
must save the affected registers on the stack and restore the original
values before returning.
"
Ce qui explique clairement que dans le cadre d'un appel de fonction : "On the other hand, the callee must restore the values of the EBX, ESI and
EDI registers" donc tu dois restorer par convention les registres EBX, ESI et EDI qui ont servi à passer les paramètres à la fonction. (il se peut effectivement que l'appelant fasse la sauvegarde, ce qui explique que dans certain cas cela ne plante pas, mais par convention elle n'y est pas obligé et peut donc planter ;) ).

dune2.

Gentoo... que du bonheur ...
0

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

Posez votre question
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
23 avril 2007 à 21:52
Merci pour cette doc c'etait interessant.


Mais ce n'etait pas vraiment ma question en fait,

j'ai bien vu effectivement, qu'il fallait les sauvegarder ebx (sinon ca segfaultait!),

mais j'aimerais juste savoir pourquoi.


En fait j'ai un prog a rendre pour mon ecole en asm, mais j'ai decider
de le faire avec du C, le truc c'est que je que je vais devoir
expliquer pourquoi je ne touche pas a ebx! (et puis ca m'interesse
aussi de savoir evidemment). Donc si quelqu'un sait...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 avril 2007 à 22:04
Mais c'est très clair le pourquoi, le system que soit Win ou Nux utilise au maximum les registres et donc y stocke des valeurs pour accélérer le travail. Tu peux donc utiliser tous les registres que tu veux mais les restaurer après usage.

ciao...
BruNews, MVP VC++
0
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
24 avril 2007 à 00:23
Ce n'est pas encore tres clair justement...
Il faudrait que j'etudie un peu plus ce que fait le system quand il execute le programme, par rapport au format elf et aux differentes sections, parceque en effet il doit bien en quelque sorte 'parser' l'executable (entre les types/taille/portee de chaque section) et donc oui doit sans doute utiliser (pour optimiser et/ou juste garder en memoire 'rapide' quelque chose) ebx a ce moment la.. ma question s'etait pose parceque je trouvais ca etrange que juste la modifier altere alors l'execution du programme, et surtout que ceci n'est specifie que dans peu de tuto.
Merci!
0
_dune2_ Messages postés 141 Date d'inscription mercredi 19 juillet 2006 Statut Membre Dernière intervention 20 avril 2011
24 avril 2007 à 12:12
Salut,

La convention de programation est tel-quel ... maintenant si tu ne veux pas suivre la convention de programation, faut pas se plaindre de certain plantage ...
Une voiture est conçue pour utiliser un volant ... tu peux y adapter un joystick à ta sauce ... maintenant si tu te plantes avec ta voiture tu ne pourras t'en prendre qu'à toi même ...
(c'est un peu plus clair comme ça ? ;) )

Gentoo... que du bonheur ...
0
Rejoignez-nous