Stocker la valeur des registres dans un tableau

Stocker la valeur des registres dans un tableau - ASM - Programmation

Marsh Posté le 06-04-2006 à 19:52:49    

Mon problème : réaliser une sauvegarde des registres d'un x86 dans un tableau.
en C :
 
#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;
};
*/
/* Fonction permettant le changement de contexte entre deux processus */
 
void context_switch(contexte_exec *old_context, contexte_exec *new_context);
 
Mon prog 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     eflags a gérer */
/*  popl %ebx */
/*  movl %ebx,8(%eax) */  
  movl 8(%esp),%eax  /*recupération de l'adresse du seconde parametre*/  
 /* movl 8(%eax),%ebx */
/*  movl %ebx,12(%esp)*/
/*  popf   eflags a gerer */
  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
 
Aidez moi pour corriger mon programme s'il vous plaît :°)
Merci d'avance

Reply

Marsh Posté le 06-04-2006 à 19:52:49   

Reply

Marsh Posté le 07-04-2006 à 12:38:46    

Bonjour
Sauf si on connait exactement le moment ou un processus sera remplacé par un autre, et que dans ce cas on peut prévoir de ne rien mettre d'interessant dans eax, ou si on utilise jamais eax (adieu mul, div, ...) il est hasardeux, dangereux de ne pas sauvegarder eax. Sauvegarder ces valeurs en pile ou dans un emplacement mémoire ne change pas grand chose. J'utiliserais plutot un pusha puis une sauvegarde de esp dans un emplacement mémoire plutôt qu'une longue litanie de mov; au retour un échage de pointeur de pile suffit avec un popa. Si on aime pas le pusha et le popa avant de mettre le pointeur tableau dans eax, sauvegarder ce dernier sur la pile puis le resauvegarder dans la mémoire.
qu'est-ce qu'un registre crash ? je n'ai pas ce concept dans ma doc 386 (sybex)
j'imagine que c'est un registre qui quand on y met n'importe quoi permet l'obtention du message segmentation fault indiquant un crash du programme.

Reply

Sujets relatifs:

Leave a Replay

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