Aller au contenu

Exercices

Exercice

Expliquez brièvement (sur le même modèle que les exemples de la page précédente), les instructions proposées.

ADD

ADD R0, R1, #42

Solution

Additionne le nombre 42 et la valeur stockée dans le registre R1, place le résultat dans le registre R0

LDR

LDR R5,98

Solution

Place la valeur stockée à l'adresse 98 dans le registre R5

CMP, B

CMP R4, #18
BGT 77
Solution

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

STR

STR R0,15

Solution

Place la valeur stockée dans le registre R0 en mémoire 15.

B

B 100

Solution

Nous avons une structure de rupture de séquence, la prochaine instruction à exécuter se situe en mémoire vive à l'adresse 100

Exercice

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

Additionner

Additionne la valeur stockée dans le registre R0 et la valeur stockée dans le registre R1, le résultat est stocké dans le registre R5.

Solution

ADD R5, R0, R1

Charger dans un registre

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

Solution

LDR R0, 878

Charger en mémoire vive

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

Solution

STR R0, 124

SAUT

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

Solution

B 478

SAUT

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.

Solution
CMP R0, #42
BNE 85

De python vers l'assembleur

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.

Les numéros de ligne L01, L02, .. sont là pour faciliter ensuite la compréhension.

L01   MOV R0, #4
L02   STR R0,30
L03   MOV R0, #8
L04   STR R0,75
L05   LDR R0,30
L06   CMP R0, #10
L07   BNE else
L08   MOV R0, #9
L09   STR R0,75
L10   B endif
L11   else:
L12   LDR R0,30
L13   ADD R0, R0, #1
L14   STR R0,30
L15   endif:
L16   MOV R0, #6
L17   STR R0,23
L18   HALT

Après avoir analysé très attentivement le programme en assembleur ci-dessus, vous essaierez d'établir une correspondance entre les lignes du programme en Python et les lignes du programme en assembleur. À quoi correspondent les adresses mémoires 23, 75 et 30 ?

Eléments d'analyse

L01 MOV R0, #4: placer la valeur 4 dans le registre R0
L02 STR R0,30: placer la valeur stockée en R0 dans la mémoire d'adresse 30
L03 MOV R0, #8: placer la valeur 8 dans le registre R0
L04 STR R0,75: placer la valeur stockée en R0 dans la mémoire d'adresse 75
L05 LDR R0,30 : placer la valeur placée dans la mémoire d'adresse 30 dans le registre R0
L06 CMP R0, #10: compare la valeur contenue dans le registre R0 et la valeur 10
L07 BNE else : 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 L08)

Code exécuté après la comparaison de la ligne L06 s'il y avait égalité:
L08 MOV R0, #9: placer la valeur 9 dans le registre R0
L09 STR R0,75: placer la valeur stockée en R0 dans la mémoire d'adresse 75
L10 B endif: passer à l'instruction marquée de l'étiquette endif.

Code exécuté si on a sauté en ligne L11 après la comparaison en L06 (cas où il n'y a pas égalité):
L12 LDR R0, 30 : placer la valeur placée dans la mémoire d'adresse 30 dans le registre R0.
L13 ADD R0, R0, #1 : ajouter le contenu du registre R0 et la valeur 1, stocker le résultat en R0. L14 STR R0,30 : 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:
L16 MOV R0, #6 : placer la valeur 6 dans le registre R0
L17 STR R0,23 : placer la valeur stockée en R0 dans la mémoire d'adresse 23. L18 HALT : FIN

Correspondance mémoire

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