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.