kaervas
Messages postés51Date d'inscriptionvendredi 25 novembre 2005StatutMembreDernière intervention19 avril 2008
-
20 avril 2007 à 23:10
_dune2_
Messages postés141Date d'inscriptionmercredi 19 juillet 2006StatutMembreDernière intervention20 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?).
kaervas
Messages postés51Date d'inscriptionvendredi 25 novembre 2005StatutMembreDernière intervention19 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
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
kaervas
Messages postés51Date d'inscriptionvendredi 25 novembre 2005StatutMembreDernière intervention19 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).
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 ...
Vous n’avez pas trouvé la réponse que vous recherchez ?
kaervas
Messages postés51Date d'inscriptionvendredi 25 novembre 2005StatutMembreDernière intervention19 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...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
kaervas
Messages postés51Date d'inscriptionvendredi 25 novembre 2005StatutMembreDernière intervention19 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!
_dune2_
Messages postés141Date d'inscriptionmercredi 19 juillet 2006StatutMembreDernière intervention20 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 ? ;) )