Incomprehension assembleur et c

Fermé
nadal1991 Messages postés 268 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 2 octobre 2011 - Modifié par nadal1991 le 1/10/2011 à 16:50
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 3 oct. 2011 à 18:05
Bonjour,

voila je suis face à une petite incomprehension, je vous montre le bout de code :

void retour()
{
int b;
asm ("movl %0, %%esp" : :"r"(main_esp):"esp");
asm ("movl %0, %%ebp" : :"r"(main_ebp));

}

c'est en faite un fonction qui me permet de restaurer un autre contexte sauvegardé dans les deux variable (main_esp et main_ebp).
ce bout de code marche trés bien et fait ce que j'attend de lui, mais le probleme est que je suis dans l'obligation de rajouter la variable local "int b" qui sert à rien du tout dans la fonction. parceque on enlevant cette variable j'ai une erreur de segmentation.

je ne comprend rien du tout du changement apporté par cette variable local; je suis assez debutant dans l'utilisation de l'assembleur; donc un eclaircissement serait vraiment le bienvenus.

PS : pour info la fonction "retour()" est appellée par la primitive signal() lors de la capture d'un signal.

voila Merci beaucoup.



6 réponses

Up silvous plait

merci .
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
2 oct. 2011 à 17:46
Pourrais-tu détailler la syntaxe de ces 2 lignes, car je ne comprend rien à cette forme d'assembleur, ou ne serais-ce que dire ce qu'elles sont censées faire ?
0
nadal1991 Messages postés 268 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 2 octobre 2011 11
2 oct. 2011 à 20:43
la syntaxe; ben la première instruction prend le contenu de "main_esp" (c'est une valeur du registre esp précédemment sauvegardé) et elle met cette valeur dans le registre "esp.

pour la ligne deux c'est la même chose avec le registre ebp. mais bon ces instruction marche je l'ai aie déjà essayé et ca marche mon problème comme je l'avais dit c'est pourquoi la suppression de cette variable locale "b" qui sert à rien du tout mène à une erreur de segmentation.

voila merci .
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 3/10/2011 à 12:21
Oui ça d'accord mais c'est cette syntaxe AT&T, inbuvable à mon goût, qui sème le doute sur la signification précise....
La méthode est relativement barbare, et je ne suis pas étonné que ça ne fonctionne pas....
Tu pourrais sans doute passer les paramètres par des variables globales et des sauts plutôt que de chercher à restituer un contexte, ce qui est assez compliqué.
et en fait, en ajoutant une variable locale, des instructions sont ajoutées pour créer un cadre de pile, c'est à dire que ESP va prendre la valeur de 'Main_EBP' et EBP est sauvegardé puis restauré en sortie de fonction ...
Les instructions ajoutées sont celle-çi :

PUSH EBP
MOV EBP,ESP
SUB ESP,04 // Prépare 4 octets pour la variable locale

ton code est là :
asm ("movl %0, %%esp" : :"r"(main_esp):"esp");
asm ("movl %0, %%ebp" : :"r"(main_ebp));


mov ESP,EBP
POP EBP
RET 04


Le chêne aussi était un gland, avant d'être un chêne
0

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

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
3 oct. 2011 à 09:49
Bonjour,
vu que tu maitrises l'assembleur, fait une sortie assembleur et compare les codes avec et sans la variable local, peut être que la solution t'apparaitra (genre optimisation du compilateur qui mets b dans un style register).
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
3 oct. 2011 à 18:05
Il n'empêche que je ne vois pas comment ça pourrais fonctionner correctement car la méthode est très aléatoire.
Il n'est pas possible d'enregistrer un contexte de pile de cette manière, il faut dans ce cas réorienter ESP vers une nouvelle pile complète et correctement dimensionnée... Et servant uniquement à conserver les paramètres d'une fonction, ce qui se fait plus élégamment en enregistrant les paramètres dans des variables, plutôt que sur la pile.

Il faudrait idéalement que tu expliques l'intérêt de cette démarche pour qu'on puisse vraiment t'aider.
0