Stocker la valeur des registres dans un tableau - ASM - Programmation
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.
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