Quesoft
:
Kevin Kofler :
Oui, USP pointe vers le pointeur de pile utilisé par le programme, les interruptions utilisent la pile superviseur (SSP).
Deux piles donc...
Est-ce que les pointeurs USP et SSP sont gardés dans des registres ?
Oui. En mode utilisateur:
* a7 = usp
* ssp n'est pas accessible.
En mode superviseur:
* a7 = ssp
* usp est accessible à travers des instructions spéciales (
move.l %usp,%an,
move.l %an,%usp, n allant de 0 à 7, 7 déconseillé)
Je suppose que des tutoriels d’ASM doivent donner des infos là-dessus …
Oui.
Comment obtiens-on un pointeur sur la base de la pile (le début de la zone en RAM) ?
Ces adresses sont constantes. (Mais attention, la base de la pile superviseur dépend de la version de AMS si je me rappelle bien, ça a changé dans la 2.00.)
PpHd :
>- Lors d’une interruption, où est stocké la valeurs des registres du programme en cours d’exécution, des flags, l’adresse de la prochaine instruction, etc. ?
Sur la pile.
La pile utilisateur ou superviseur ?
Superviseur.
Et c'est à toi de sauvegarder les registres dans ton handler d'interruptions, ils gardent tous leur valeur et tu es obligé de remettre ces valeurs avant de retourner.
DEFINE_INT_HANDLER gère ça pour toi, mais à ta place, j'écrirais le handler entier en assembleur. Parce que dépendre de ce que
DEFINE_INT_HANDLER te met sur la pile est dangereux, la définition de
DEFINE_INT_HANDLER peut changer à tout moment (nous comptons virer le wrapper actuel et utiliser un attribut de GCC pour faire un handler d'interruptions directement).