Aller au contenu

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.

Langage assembleur
        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.

Langage assembleur
        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 :

Langage assembleur
        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.