2/ Codage d’une itération
Regardons maintenant comment procéder pour coder une itération. On veut créer un programme ayant le
même résultat que précédemment, mais cette fois-ci nous voulons utiliser une itération pour être bien plus
efficace (imaginez donc devoir affecter 500 cases de tableau, à 3 instructions par affectation, il nous faudrait
taper au minimum 1 500 lignes de code !).
Ce programme est déjà réalisé, c’est le fichier iteration.s. Grâce à gdb, regardons quelles sont les valeurs
contenues à chaque itération dans les registres r0 et r2:
r0: ce registre doit contenir, d'après l'algorithme donné, l'adresse courante de la case de notre tableau que l’on
souhaite affecter. r0 prend pour valeurs successives : 77484 (debut_TAB+0*4), 77488 (debut_TAB +1*4),
77492 debut_TAB + 2*4), 77496 (debut_TAB + 3*4), 77500 ( debut_TAB + 4*4)
r2: ce registre doit contenir, d'après l'algorithme donné, la variable d’incrémentation. r2 prend pour valeurs
successives : 0, 1, 2, 3, 4, 5
La valeur contenue dans r2 à la fin de l’itération, c’est-à-dire lorsque le contrôle est à l’étiquette fintq est
donc 5 (normal car on veut réaliser 5 fois notre affectation).
Supposons maintenant que l’algorithme soit écrit avec tant que i <= 4 au lieu de tant que i <> 5. Le tableau
contiendra les mêmes valeurs à la fin de l’itération ! En effet dans cette deuxième version on va bien réaliser
5 fois notre affectation : pour i=0, 1, 2, 3, 4. Exactement comme dans notre premier algorithme. On décide de
coder avec le nouvel algorithme jusqu’à la fin de cette partie.
Supposons que le tableau soit maintenant un tableau de mots de 16 bits. On modifie le programme qui
devient iteration2.s (voir partie listing). Il nous suffit juste de prendre en compte que chaque case de notre
tableau ne fait plus que 2octets (car 16bits = 2octets) : on réserve donc moins de place en mémoire en début
de programme, on ne multiplie i que par 2 à chaque itération.
Même chose pour un tableau d’octets. Dans ce cas, chaque case ne fait plus qu’un seul octet. Voir le
programme iteration3.s
3/ Calcul de la suite de “Syracuse”
On désire désormais dans cette troisième partie créer un programme en assembleur qui nous calcule les n
premiers termes de la suite de Syracuse.
Donnons pour commencer les valeurs de la suite de Syracuse pour U0 = 15, calculées à la main: U0=15,
U1= 46, U2=23, U3= 70, U4=35, U5= 106, U6= 53,U7= 160, U8= 80, U9= 40, U10= 20, U11= 10, U12=5
U13= 16, U14= 8, U15= 4, U16= 2, U17=1, U18=4, U19=2, etc... On remarque que cette suite converge vers
1 avec un cycle de 3.
Pour coder ce programme il nous a fallu tout simplement suivre l’algorithme et les indications fournies dans
le poly (trop facile). On se limitera à calculer les 50 premiers termes de cette suite.
On vérifie sous gdb le bon déroulement de notre programme :
r4 : ce registre va nous servir de compteur du rang de la suite. r4 prend pour valeur successives : 0, 1, 2, 3, 4,
5, ….. 17. On a bien retrouvé que notre suite converge vers 1 à partir du 17ème terme.
r0 : ce registre contient à l’initialisation du programme la valeur qu’on attribue au premier terme (U0) de la
suite (ici 15). r0 est ensuite modifié selon l’algorithme de notre programme. C’est donc la valeur courante de
la suite. r0 prend bien pour valeurs successives les mêmes nombres que l’on a calculé à la main un peu plus
haut : 15, 46, 23, 70, …..,1
r3 : ce registre va nous servir de comparaison. On continue notre boucle tant que la valeur courante de la
suite (contenue dans r0) est différente de 1. r3 contient la valeur 1 et n’est pas modifié durant l’exécution du