Simulons une interaction avec une interface réseau (nous envoyant du texte)
Nous supposons que la carte réseau déclenche une interruption de type IRQ à chaque fois qu'un nouveau caractère est reçu. Cette interruption copie ce caractère dans un espace mémoire pré alloué. Ceci constitue un bon exemple de comment sauvegarder et restaurer les registres lors d'une interruption.
Activer
Type
cycles
cycles (premier)
Vitesse d'exécution : ms
Français
SECTION INTVEC
; Table des vecteurs d'interruption
B main
NOP
NOP
NOP
NOP
NOP
B moninterruptionIRQ
NOP
donnees ASSIGN8 "Je pense qu'il y a un marche mondial pour quelque chose comme cinq ordinateurs.", 0
position ASSIGN32 0
SECTION CODE
moninterruptionIRQ
; Préparation de la pile
; Question : puisque les 2 lignes suivantes seront toujours les mêmes
; (autrement dit, l'emplacement de pileIRQ ne change pas et il faut toujours ajouter 32),
; pourquoi ne peut-on pas le faire dans le "main"?
LDR SP, =pileIRQ
ADD SP, SP, #32
PUSH {R0-R3} ; Sauvegarde des registres utilisés
LDR R0, =donnees
LDR R1, =donneesRecues
LDR R2, position
LDRB R3, [R0, R2] ; LDRB parce qu'on ne lit qu'un seul octet
CMP R3, #0 ; Si la valeur lue est 0, c'est qu'on a atteint la fin de la chaîne
BEQ finInterruption
STRB R3, [R1, R2]
ADD R2, R2, #1 ; On passe au caractère suivant (qui sera copié lors de la prochaine interruption)
STR R2, position
finInterruption
POP {R0-R3} ; Restauration des registres
ADDS PC, LR, #-4 ; N'importe quelle opération arithmétique avec PC et S est valable
main
; Rien de particulier ici, simplement une boucle infinie
ADD R1, R1, #1
ADD R2, R2, #2
ADD R3, R3, #3
ADD R4, R4, #4
ADD R5, R5, #5
B main
SECTION DATA
pileIRQ ALLOC32 8
donneesRecues ALLOC8 256