td1 Corr
td1 Corr
td1 Corr
L’objectif de ce TD est de vous familiariser avec le cycle d’exécution d’un processeur et avec
la notion de flux d’instructions. Pour cela, il vous est demandé d’écrire de petits programmes
dans le langage assembleur présenté en cours et de simuler leur exécution par le processeur.
Correction.
1
Cycles CP instruction r0 10 11
INIT 1 ? 5 ?
1 2 lecture 10 r0 5
2 3 ecriture r0 11 5
3 4 stop
Figure 1 – Simulation de la copie de valeur
1 Initialisation de la mémoire
Écrire les programmes répondant aux problèmes suivants :
1. Soit la valeur 8 contenue dans la case mémoire d’adresse 10. Recopier cette valeur à
l’adresse 11.
Correction.
1 lecture 10 r0
2 ecriture r0 11
3 stop
4
2
2. Sans connaître la valeur contenue à l’adresse 10, écrire 7 à l’adresse 10.
Correction.
1 valeur 7 r0
2 ecriture r0 10
3 stop
4
3. Sans connaître la valeur contenue à l’adresse 10, incrémenter cette valeur de 1.
Correction.
1 lecture 10 r0
2 valeur 1 r1
3 add r1 r0
4 ecriture r0 10
5 stop
6
4. Soit une valeur quelconque, a, contenue à l’adresse 10. Initialiser la case d’adresse 11 à
a × 2 + 1.
Correction.
1 lecture 10 r0
2 valeur 2 r1
3 mult r1 r0
4 valeur 1 r1
5 add r1 r0
6 ecriture r0 11
7 stop
8
5. Soit une valeur quelconque, a, contenue à l’adresse 10. Initialiser la case d’adresse 11 à
a × (2 + 1).
Correction.
1 lecture 10 r0
2 valeur 2 r1
3 valeur 1 r2
4 add r1 r2
5 mult r2 r0
6 ecriture r0 11
7 stop
8
3
2 Trace de programme assembleur
Nous allons désormais produire une représentation de l’exécution pas à pas de nos pro-
grammes. Une trace d’un programme assembleur sera un tableau dont chaque ligne correspond
à l’exécution d’une instruction par le processeur. Une colonne contiendra le cycle d’horloge du
processeur et une autre colonne le compteur de programme. Il y aura également une colonne
par registre utilisé dans le programme et par case mémoire où des données sont lues ou écrites
par les instructions du programme. Une première ligne, d’initialisation, montrera l’état de ces
registres et cases mémoires avant le début du programme. Ensuite, chaque exécution d’instruc-
tion sera représentée par une nouvelle ligne du tableau, jusqu’à exécution de l’instruction stop.
Dans cette ligne nous représenterons le cycle d’horloge du processeur (en commençant à 0 pour
la ligne d’initialisation), la valeur du compteur de programme après exécution de l’instruction,
et, s’il y a lieu, la valeur du registre ou de la case mémoire modifiée par le programme.
Instructions Cycles CP r0 r2 10 11
Initialisation 0 1 ? ? 14 ?
lecture 10 r0 1 2 14
valeur 5 r2 2 3 5
Correction.
soustr r2 r0 3 4 9
sautpos r0 8 4 8
ecriture r0 11 5 9 9
stop 6 10
4
La valeur contenue dans le registre 0 est 0, celle contenue dans le registre 1 est indéterminée,
celle contenue dans le registre 2 est 5.
Correction.
1 lecture 15 r0 # a
2 lecture 16 r1 # b
3 soustr r1 r0 # r0 vaut a - b
4 sautpos r0 8 # si a - b >= 0 (cad a >= b) on saute sur le alors
5 lecture 16 r0 # sinon ecrire b a l’adresse 17
6 ecriture r0 17
7 saut 10
8 lecture 15 r0 # alors ecrire a a l’adresse 17
9 ecriture r0 17
10 stop
11 ?
12 ?
13 ?
14 ?
15 23 # a
16 45 # b
17 ? # <-- valeur de sortie
2. Soit l’âge d’une personne à l’adresse 15. Si cette personne est majeure alors écrire 1 à
l’adresse 16 sinon écrire 0 à l’adresse 16.
Correction.
5
Instructions Cycles CP r0 r1 15 16 17
Initialisation 0 1 ? ? 23 45 ?
lecture 15 r0 1 2 23
lecture 16 r1 2 3 45
soustr r1 r0 3 4 -22
sautpos r0 8 4 5
lecture 16 r0 5 6 45
ecriture r0 17 6 7 45
saut 10 7 10
stop 8 11
Figure 2 – Simulation du calcul du max de a et b (1)
Instructions Cycles CP r0 r1 15 16 17
Initialisation 0 1 ? ? 45 23 ?
lecture 15 r0 1 2 45
lecture 16 r1 2 3 23
soustr r1 r0 3 4 22
sautpos r0 8 4 8
lecture 15 r0 5 9 45
ecriture r0 17 6 10 45
stop 7 11
Figure 3 – Simulation du calcul du max de a et b (2)
9 ecriture r0 16
10 stop
11 ?
12 ?
13 ?
14 ?
15 17 # a
16 ? # <-- valeur de sortie
Soit la donnée x d’adresse 15. On veut écrire la valeur absolue de x à l’adresse 16.
Cycles CP instruction r0 r1 15 16
INIT 1 ? ? 17 ?
1 2 lecture 15 r0 17
2 3 valeur -18 r1 -18
3 4 add r0 r1 -1
4 5 sautpos r1 8
5 6 valeur 0 r0 0
6 7 ecriture r0 16 0
7 10 saut 10
8 11 stop
Figure 4 – Simulation du test de la majorité (1)
6
Cycles CP instruction r0 r1 15 16
INIT 1 ? ? 20 ?
1 2 lecture 15 r0 20
2 3 valeur -18 r1 -18
3 4 add r0 r1 2
4 8 sautpos r1 8
5 9 valeur 1 r0 1
6 10 ecriture r0 16 1
7 11 stop
Figure 5 – Simulation du test de la majorité (2)
Correction.
– Si x < 0
– Alors écrire −x à l’adresse 16
– Sinon écrire x à l’adresse 16
2. Écrire un programme réalisant cette tâche.
Correction.
– Si x < 0
1 lecture 15 r0
2 sautpos r0 6 <-- saute sur le sinon
– Alors écrire −x à l’adresse 16
3 inverse r0
4 ecriture r0 16
5 saut 7 <-- saute sur le stop
– Sinon écrire x à l’adresse 16
6 ecriture r0 16
– suite du programme
7 stop
.. 8 ?
.
14 ?
15 5
16 ?
3. Construire une trace de votre programme lorsque x vaut 5, puis lorsque x vaut −5.
7
Instructions Cycles CP r0 15 16
Initialisation 0 1 ? 5 ?
lecture 15 r0 1 2 5
sautpos r0 6 2 6
ecriture r0 16 3 7 5
stop 4 8
Figure 6 – Trace du calcul de la valeur absolue de 5
Instructions Cycles CP r0 15 16
Initialisation 0 1 ? -5 ?
lecture 15 r0 1 2 -5
sautpos r0 6 2 3
inverse r0 3 4 5
ecriture r0 16 4 5 5
saut 7 5 7
stop 6 8
Figure 7 – Trace du calcul de la valeur absolue de −5
8
4 Boucles d’instructions
4.1 Boucles infinies
1. Avec l’instruction saut, écrire un programme qui ne termine jamais.
Correction.
1 saut 1
2 stop # <- jamais atteint
2. Avec l’instruction sautpos, écrire un programme qui ne termine jamais.
Correction.
1 valeur 0 r0
2 sautpos r0 1
3 stop # <- jamais atteint
Correction.
– x vaut n
– Tant que x ≥ 0 : écrire x puis enlever 1 à x
Pour la traduction en assembleur de l’algorithme, on imite le schéma de traduction stan-
dard du while (...) { ... } . Dans cette traduction le test décidant de (la répétition
de) l’exécution de la boucle, vient juste après le corps de la boucle plutôt qu’avant. Et il
y a juste avant le corps de boucle un saut vers ce test. Ainsi la condition de saut traduit
la condition d’exécution (non sa négation) en un minimum de lignes.
1 lecture 15 r0
2 saut 6 <-- saut sur le test d’execution de boucle
3 ecriture r0 16 <corps de boucle>
4 valeur -1 r1
5 add r1 r0 </corps de boucle>
6 sautpos r0 3 <condition de boucle/>, saut sur le corps de boucle
7 stop
8 ?
9 ?
10 ?
11 ?
12 ?
13 ?
14 ?
9
Instructions Cycles CP r0 r1 15 16
Initialisation 0 1 ? ? 3 ?
lecture 15 r0 1 2 3
saut 6 2 6
sautpos r0 3 3 3
ecriture r0 16 4 4 3
valeur -1 r1 5 5 -1
add r1 r0 6 6 2
sautpos r0 3 7 3
ecriture r0 16 8 4 2
valeur -1 r1 9 5 -1
add r1 r0 10 6 1
sautpos r0 3 11 3
ecriture r0 16 12 4 1
valeur -1 r1 13 5 -1
add r1 r0 14 6 0
sautpos r0 3 15 3
ecriture r0 16 16 4 0
valeur -1 r1 17 5 -1
add r1 r0 18 6 -1
sautpos r0 3 19 7
stop 20 8
Figure 8 – Décrément pour n = 3
15 3
16 ?
2. Décrire P
un algorithme calculant la somme des entiers 0, 1, . . . , n. Par convention cette
somme, ni=0 i = 0+1+. . .+n est nulle lorsque n < 0. Écrire le programme correspondant.
Le résultat de la sommation sera écrit à l’adresse 16.
10
8 soustr r2 r0 :: r0 vaut n - i
9 sautpos r0 4 :: si n >= i saut sur corps_de_boucle </condition_de_boucle>
10 ecriture r1 16 :: ecriture du resultat
11 stop
12 ?
13 ?
14 ?
15 3 <-- n
16 ? <-- valeur de retour
La boucle incrémente i. Dans amil, à cause de la difficulté à écrire des tests tels que
i ≤ n, il serait plus rapide sur cet exercice de décrémenter n jusqu’à 0 comme à la
question précédente :
– x vaut n, la somme vaut 0
– Tant que x ≥ 0, ajouter x à la somme et décrementer x.
Cette réponse est correcte et on peut encourager dans un premier temps les étudiants qui
cherchent dans cette direction, mais, pour les préparer à la suite du cours, il faut leur
donner la correction qui incrémente l’indice.
Parmi les autres programmes
Pn corrects possibles, des étudiants peuvent même penser à la
n(n+1)
formule de Gauss i=0 i = 2 .
3. (Optionnel) Tester votre programme en construisant sa trace pour n = 3.
Correction. Cette question n’est à traitée qu’au cas où les étudiants auraient eu de
grosses difficultés avec la précédente trace. Dans un groupe ou les traces passent mal, la
similitude avec l’exercice précédent peut aider à leur faire refaire une trace (dans ce cas
on donne la correction). La trace est donnée figure 9.
Correction.
– La somme vaut 0
– Pour i allant de 1 à n, ajouter xi à la somme.
2. Écrire un programme réalisant cet algorithme. (Vous aurez besoin des instructions
lecture *ri rj et ecriture ri *rj). Le résultat sera écrit à l’adresse 30 + n + 1.
Correction.
1 valeur 0 r0 :: initialisation de l’accumulateur
2 valeur 1 r2 :: initialisation de l’indice de boucle
3 saut 9 :: saut sur la condition de boucle
4 valeur 30 r4 <corps_de_boucle>
5 add r2 r4
6 lecture *r4 r5
11
Instructions Cycles CP r0 r1 r2 r3 15 16
Initialisation 0 1 ? ? ? ? 3 ?
valeur 0 r1 1 2 0
valeur 0 r2 2 3 0
saut 7 3 7
lecture 15 r0 4 8 3
soustr r2 r0 5 9 3
sautpos r0 4 6 4
add r2 r1 7 5 0
valeur 1 r3 8 6 1
add r3 r2 9 7 1
lecture 15 r0 10 8 3
soustr r2 r0 11 9 2
sautpos r0 4 12 4
add r2 r1 13 5 1
valeur 1 r3 14 6 1
add r3 r2 15 7 2
lecture 15 r0 16 8 3
soustr r2 r0 17 9 1
sautpos r0 4 18 4
add r2 r1 19 5 3
valeur 1 r3 20 6 1
add r3 r2 21 7 3
lecture 15 r0 22 8 3
soustr r2 r0 23 9 0
sautpos r0 4 24 4
add r2 r1 25 5 6
valeur 1 r3 26 6 1
add r3 r2 27 7 4
lecture 15 r0 28 8 3
soustr r2 r0 29 9 -1
sautpos r0 4 30 10
ecriture r1 16 31 11 6
stop 32 12
Figure 9 – Somme des entiers de 0 à 3
12
7 add r5 r0 :: r0 contient la somme des r2 premiers elements
8 add 1 r2 </corps_de_boucle>
9 lecture 30 r1 <condition_de_boucle>
10 soustr r2 r1 :: r1 vaut n - r2
11 sautpos r3 4 </condition_de_boucle>, saut sur corps_de_boucle
12 valeur 31 r4
13 add r1 r4
14 ecriture r0 *r4
15 stop
16 ?
17 ?
18 ?
19 ?
20 ?
21 ?
22 ?
23 ?
24 ?
25 ?
26 ?
27 ?
28 ?
29 ?
30 3
31 100
32 1
33 10
34 ? <-- resultat
3. Écrire un algorithme qui trouve le plus petit des entiers parmi x1 , . . . , xn . En déduire
un programme réalisant cette recherche du minimum. Le résultat sera écrit à l’adresse
30 + n + 1.
Correction.
– Prendre x1 comme étant le minimum.
– Pour i allant de 2 à n :
– Si xi est plus petit que le minimun alors prendre xi comme étant le minimum.
1 lecture 30 r1
2 lecture 31 r0 :: initialisation du minimum a x1
3 valeur 2 r2 :: initialisation de l’indice de boucle
4 saut 12 :: saut sur la condition de boucle
5 valeur 30 r4 <corps_de_boucle>
6 add r2 r4
7 lecture *r4 r5 :: r5 contient l’element suivant, xi
8 soustr r0 r5 <condition_du_si> r5 vaut xi - minimum (xi < minimum ?)
9 sautpos r5 11 </condition_du_si> saute apres le bloc alors
10 lecture *r4 r0 <alors/>
13
Instructions Cycles CP r0 r1 r2 r4 r5 30 31 32 33 34
Initialisation 0 1 ? ? ? ? ? 3 100 1 10 ?
valeur 0 r0 1 2 0
valeur 1 r2 2 3 1
saut 9 3 9
lecture 30 r1 4 10 3
soustr r2 r1 5 11 2
sautpos r3 4 6 4
valeur 30 r4 7 5 30
add r2 r4 8 6 31
lecture *r4 r5 9 7 100
add r5 r0 10 8 100
add 1 r2 11 9 2
lecture 30 r1 12 10 3
soustr r2 r1 13 11 1
sautpos r3 4 14 4
valeur 30 r4 15 5 30
add r2 r4 16 6 32
lecture *r4 r5 17 7 1
add r5 r0 18 8 101
add 1 r2 19 9 3
lecture 30 r1 20 10 3
soustr r2 r1 21 11 0
sautpos r3 4 22 4
valeur 30 r4 23 5 30
add r2 r4 24 6 33
lecture *r4 r5 25 7 10
add r5 r0 26 8 111
add 1 r2 27 9 4
lecture 30 r1 28 10 3
soustr r2 r1 29 11 -1
sautpos r3 4 30 4
valeur 30 r4 31 5 30
add r2 r4 32 6 34
lecture *r4 r5 33 7 34
14
11 add 1 r2 </corps_de_boucle>
12 valeur 0 r3 <condition_de_boucle>
13 add r1 r3
14 soustr r2 r3 :: r3 vaut n - r2
15 sautpos r3 5 </condition_de_boucle> saut sur corps_de_boucle
16 valeur 31 r4
17 add r1 r4 :: r4 vaut 30 + n + 1
18 ecriture r0 *r4
19 stop
20 ?
21 ?
22 ?
23 ?
24 ?
25 ?
26 ?
27 ?
28 ?
29 ?
30 3 :: n
31 10 :: x1
32 100 :: ...
33 1 :: xn
34 ? <-- resultat
15
Instructions Cycles CP r0 r1 r2 r3 r4 r5 30 31 32 33 34
Initialisation 0 1 ? ? ? ? ? ? 3 10 100 1 ?
lecture 30 r1 1 2 3
lecture 31 r0 2 3 10
valeur 2 r2 3 4 2
saut 12 4 12
valeur 0 r3 5 13 0
add r1 r3 6 14 3
soustr r2 r3 7 15 1
sautpos r3 5 8 5
valeur 30 r4 9 6 30
add r2 r4 10 7 32
lecture *r4 r5 11 8 100
soustr r0 r5 12 9 90
sautpos r5 11 13 11
add 1 r2 14 12 3
valeur 0 r3 15 13 0
add r1 r3 16 14 3
soustr r2 r3 17 15 0
sautpos r3 5 18 5
valeur 30 r4 19 6 30
add r2 r4 20 7 33
lecture *r4 r5 21 8 1
soustr r0 r5 22 9 -9
sautpos r5 11 23 10
lecture *r4 r0 24 11 1
add 1 r2 25 12 4
valeur 0 r3 26 13 0
add r1 r3 27 14 3
soustr r2 r3 28 15 -1
sautpos r3 5 29 16
valeur 31 r4 30 17 31
add r1 r4 31 18 34
ecriture r0 *r4 32 19 1
stop 33 20
16