Pour aller plus loin⚓︎
Utilisation de la mémoire vive
Dans tous les programmes précédents, nous n’utilisons que les registres. Mais si nous voulons stocker une liste de valeurs, il faut utiliser la mémoire vive.
Dans l’exemple du cours, nous avons vu que nous pouvons associer une adresse à chaque variable. Mais pour une liste, on doit mettre à jour l’adresse utilisée au fur et à mesure de l’exécution.
Le programme suivant va stocker les valeurs de 10 à 1 à partir de l’adresse 0x100
, c’est-à -dire 256.
MOV R12, #0x100 ; adresse mémoire de départ
MOV R0, #10 ; valeur de départ
boucle STR R0, [R12] ; on sauve R0 Ă l'adresse R12
ADD R12, R12, #4 ; on passe Ă l'adresse suivante
SUB R0, R0, #1
CMP R0, #0 ; on arrete quand on arrive Ă 0
BGT boucle
END
Les adresses mémoires vont de 4 en 4 puisque chaque adresse peut contenir 4 octets, c’est-à -dire 32 bits.
Le langage permet à la fois de sauvegarder la valeur à l'adresse donnée, mais aussi de calculer la prochaine adresse. C'est ce que fait le programme suivant.
MOV R12, #0x100 ; adresse mémoire de départ
MOV R0, #10 ; valeur de départ
boucle STR R0, [R12], #4 ; on sauve R0 Ă l'adresse R12 et on ajoute 4
SUB R0, R0, #1
CMP R0, #0 ; on arrete quand on arrive Ă 0
BGT boucle
END
Exercice 14
En vous inspirant des exemples ci-dessus, modifier le programme sur la suite de Syracuse pour sauvegarder les valeurs successives.
Écrire des fonctions
Puisqu'il faut préciser le label de retour après un bloc de code qui se termine par un saut, il n'est pas possible d'écrire ainsi une fonction. En effet, comment appeler cette fonction depuis différents endroits du programme si on revient toujours au même endroit à la fin.
La solution consiste à mémoriser la valeur de PC
avant de faire le saut vers la fonction. Ensuite, en remettant la valeur de PC
, on peut retourner au point précédent du programme.
Les instructions de saut BL
, BLEQ
, BLNE
... permettent de faire cela en copiant la valeur de PC
dans le registre LR
. Ensuite, avec l'instruction MOV PC, LR
permet de reprendre l'exécution du programme après le saut.
Voici un exemple :
MOV R0, #5 ; R0 = 5
BL double ; on double R0
ADD R0, R0, #1 ; on rajoute 1
BL double ; on double R0
END ; R0 = 22
double ADD R0, R0, R0
MOV PC, LR
Exercice 15
Écrire un programme en assembleur qui détermine si le nombre R0
est premier. Vous pourrez utiliser les programmes que vous avez précédemment écrits.
Exercice 16
Écrire un programme en assembleur qui met en mémoire la liste des nombres premiers inférieurs à \(n\), où \(n\) est un nombre stocké dans un registre de votre choix.