Incomprehension assembleur et c

nadal1991 Messages postés 268 Date d'inscription   Statut Membre Dernière intervention   -  
nicocorico Messages postés 799 Date d'inscription   Statut Membre Dernière intervention   -
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.



A voir également:

6 réponses

nadal1991
 
Up silvous plait

merci .
0
nicocorico Messages postés 799 Date d'inscription   Statut Membre Dernière intervention   138
 
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   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   138
 
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   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention   138
 
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