Changement de contexte : C + assembleur

Changement de contexte : C + assembleur - C - Programmation

Marsh Posté le 06-04-2006 à 18:33:26    

Quelqu'un pourrait-il m'aider pour un changement de contexte à réaliser en assembleur + C?
Voilà ce que j'ai fait :
 
Fichier context_switch.h :
 
#define NB_REG 8
typedef int contexte_exec[NB_REG];
/* 0  esp;
   1  ebp;
   2  eflags;
   3  ebx;
   4  ecx;
   5  edx;
   6  esi;
   7  edi;
};
void context_switch(contexte_exec *old_context, contexte_exec *new_context);
 
Ma fonction en assembleur :  
 
.text
   
.global context_switch
 
context_switch:  
  movl 4(%esp),%eax  /*On recupere l'adresse du tableau de lancien contexte, eax est un registre crash on peut y stocker l'adresse  */
  movl %esp,(%eax)  /*Cette adresse correspond au champ esp, on sauvegarde donc l'ancienne valeur d'esp */
  movl %ebp,4(%eax)  /*Tableau d'entiers pour context, on accede a chaque champ par saut de 4 */
  movl %ebx,12(%eax)
  movl %ecx,16(%eax)  
  movl %edx,20(%eax)  
  movl %esi,24(%eax)  
  movl %edi,28(%eax)
/*        pushf           */ A traites : les flags
/*        movl %ebx,8(%eax) */  
         movl 8(%esp),%eax  /*recupération de l'adresse du seconde parametre*/  
/*             movl 8(%eax),%ebx */   flags a traiter  
/*        movl %ebx,12(%esp)*/
/*        popf                      */
  movl 28(%eax),%edi
  movl 24(%eax),%esi
  movl 20(%eax),%edx
  movl 16(%eax),%ecx
  movl 12(%eax),%ebx  
  movl 4(%eax),%ebp  
  movl 0(%eax),%esp
  ret
 
Ca veut par marcher :'(((  
Si vous pouviez me donner des détails pour faire marcher ce changement de contexte :°) je suis preneur
Merci d'avance

Reply

Marsh Posté le 06-04-2006 à 18:33:26   

Reply

Marsh Posté le 06-04-2006 à 19:01:07    

cris__tof a écrit :

Quelqu'un pourrait-il m'aider pour un changement de contexte à réaliser en assembleur + C?


Normalement, on utilise setjmp() longjmp() et la structure qui va avec, c'est fait pour... Y'a pas besoin d'assembleur...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 06-04-2006 à 19:05:56    

C'est de la programmation d'os ... Je dois sauvegarder tous les registres dans une structure (un tableau dans mon cas), et restaurer ensuite les valeurs du nouveau contexte.

Reply

Marsh Posté le 06-04-2006 à 19:08:35    

cris__tof a écrit :

C'est de la programmation d'os ... Je dois sauvegarder tous les registres dans une structure (un tableau dans mon cas), et restaurer ensuite les valeurs du nouveau contexte.


C'est exactement ce que font setjmp() et longjmp().
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 06-04-2006 à 19:12:43    

Tu fais exprès de pas comprendre je pense?  
Je programme un OS de A à Z.
J'ai pas le droit à ces fonctions là, je dois faire MON changement de contexte avec un tableau pour contenir les valeurs des registres.

Reply

Marsh Posté le 06-04-2006 à 23:21:28    

Toi, t'es en projet systeme :-)

Reply

Marsh Posté le 07-04-2006 à 01:31:44    

Citation :


Tu fais exprès de pas comprendre je pense?  
Je programme un OS de A à Z.
J'ai pas le droit à ces fonctions là, je dois faire MON changement de contexte avec un tableau pour contenir les valeurs des registres.


te prends pas la tête, tu trouvera facilement les sources de ces fonctions setjmp/longjmp sur le net, un ptit copier/coller et ça ira.
 
bien sûr, pour le challenge tu peut aussi essayer de le faire par toi même.
 
- eaf: un petit push peut être pour le sauvegarder?
si la fonction switch est appelée par une interruption, tu est en train d écraser le registre eax.
 
- les flags: pourquoi pas avant ebx?
- est tu sûr de l ordre des arguments::
  movl 4(%esp),%eax  /*On recupere l'adresse du tableau de lancien contexte, eax est un registre crash on peut y stocker l'adresse  */
  movl %esp,(%eax)  /*Cette adresse correspond au champ esp, on sauvegarde donc l'ancienne valeur d'esp */

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed