Aller au contenu

Exercices

Exercice E06.51

Expliquez brièvement (sur le même modèle que dans la page précédente) les instructions suivantes.

  1. ADD R0, R1, #42

    Une réponse

    Additionner le nombre 42 et la valeur stockée dans le registre R1, puis placer le résultat dans le registre R0

  2. LDR R5,98

    Une réponse

    Placer la valeurs stockée à l'adresse mémoire 98 dans le registre R5

  3. On considère les deux instructions :

    CMP R4, #18
    BGT 77
    

    Une réponse

    Si la valeur stockée dans le registre R4 est plus grande que 18, alors la prochaine instruction à exécuter se situe à l'adresse mémoire 77.

  4. STR R0,15

    Une réponse

    Placer la valeur stockée dans le registre R0 à l'adresse mémoire 15.

  5. B 100

    Une réponse

    Structure de rupture de séquence : la prochaine instruction à exécuter se situe en mémoire vive à l'adresse 100

Exercice E06.52

Écrire les instructions en assembleur correspondant aux phrases données.

  1. Soustraire la valeur stockée dans le registre R0 à la valeur stockée dans le registre R1, le résultat est stocké dans le registre R5.

    Une réponse

    SUB R5, R1, R0

  2. Placer la valeur stockée à l'adresse mémoire 878 dans le registre R0.

    Une réponse

    LDR R0, 878

  3. Placer le contenu du registre R0 en mémoire vive à l'adresse 124.

    Une réponse

    STR R0, 124

  4. La prochaine instruction à exécuter se situe en mémoire vive à l'adresse 478.

    Une réponse

    B 478

  5. Si la valeur stockée dans le registre R0 n'est pas égale à 42, alors la prochaine instruction à exécuter se situe à l'adresse mémoire 85.

    Une réponse
    CMP R0, #42
    BNE 85
    

Exercice E06.53

Voici un programme Python très simple :

x = 4
y = 8
if x == 10:
  y = 9
else :
  x = x+1
z = 6

Voici maintenant son équivalent en assembleur.

MOV R0, #4
STR R0,30
MOV R0, #8
STR R0,75
LDR R0,30
CMP R0, #10
BNE else
MOV R0, #9
STR R0,75
B endif
else:
LDR R0,30
ADD R0, R0, #1
STR R0,30
endif:
MOV R0, #6
STR R0,23
HALT
  1. Analyser instruction par instruction la signification du programme en assembleur ci-dessus afin d'établir une correspondance entre les lignes du programme en Python et les lignes du programme en assembleur (se servir des numéros de ligne pour éviter de recopier les instructions).
  2. À quelles variables Python correspondent les adresses mémoires 23, 75 et 30 ?
1. Éléments d'analyse

Ligne 1 : placer la valeur 4 dans le registre R0
Ligne 2 : placer la valeur stockée en R0 dans la mémoire d'adresse 30
Ligne 3 : placer la valeur 8 dans le registre R0
Ligne 4 : placer la valeur stockée en R0 dans la mémoire d'adresse 75
Ligne 5 : placer la valeur stockée dans la mémoire d'adresse 30 dans le registre R0
Ligne 6 : compare la valeur contenue dans le registre R0 et la valeur 10
Ligne 7 : si le contenu de R0 n'est pas égal à 10, passer à l'instruction qui suit l'étiquette else (sinon passer à l'instruction de la ligne suivante : ligne 8)

Code exécuté après la comparaison de la ligne 6 s'il y avait égalité :
Ligne 8 : placer la valeur 9 dans le registre R0
Ligne 9: placer la valeur stockée en R0 dans la mémoire d'adresse 75
Ligne 10 : passer à l'instruction marquée de l'étiquette endif.

Code exécuté si on a sauté en ligne 11 après la comparaison en ligne 6 (cas où il n'y a pas égalité) :
Ligne 12 : placer la valeur stockée dans la mémoire d'adresse 30 dans le registre R0.
Ligne 13 : ajouter le contenu du registre R0 et la valeur 1, stocker le résultat en R0.
Ligne 14 : placer la valeur stockée en R0 dans la mémoire d'adresse 30.

Code exécuté dans tous les cas après avoir exécuté les lignes 8, 9 ou les lignes 12 à 14 :
Ligne 16 : placer la valeur 6 dans le registre R0
Ligne 17 : placer la valeur stockée en R0 dans la mémoire d'adresse 23.
Ligne 18 : FIN

2. Correspondance mémoire

La mémoire 23 correspond à la variable Python z.
La mémoire 30 correspond à la variable Python x.
La mémoire 75 correspond à la variable Python y.