Changement de contexte : C + assembleur - C - Programmation
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...
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.
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().
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.
Marsh Posté le 07-04-2006 à 01:31:44
Citation : |
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 */
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