Afin de comparer les différentes séquences d’instructions à la séquence originale, nous décidons de retranscrire la séquence depuis le langage assembleur vers un langage plus simple. Cela facilitera la comparaison des différents algorithmes. La retranscription de cette séquence devient:
Après avoir retranscrit la séquence, nous observons les faits suivants: si r1 est positif, nous l’utilisons sans modification jusqu’à la fin du programme. Sinon, si r1 est négatif, il sera transformé en son équivalent positif. Donc nous sommes en train de calculer la valeur absolue de r1.
Les séquences d’instructions qui sont exactement équivalentes à celle ci-dessus sont c) et e). Nous allons regarder ça de plus près ci-dessous.
a) La retranscription de la séquence donne:
La séquence a) ne correspond pas à un calcul de valeur absolue de r1, puisqu’un nombre positif devient
négatif, et un nombre négatif reste négatif.
b) La retranscription de la séquence donne:
La séquence b) ne correspond pas à un calcul de valeur absolue de r1, car si r1 = 1 avant l’exécution de la séquence, alors r1 = -1 après. Cependant, le calcul est correct pour tout valeur entière de r1 autre que 1.
c) La retranscription de la séquence donne:
La séquence c) correspond donc bien à un calcul de valeur absolue de r1 (pour être tout à fait exact, il diffère de l’énoncé uniquement pour r1 = 0, mais comme -0 = 0, leur comportement est fonctionellement identique).
d) La retranscription de la séquence donne:
La séquence d) ne correspond pas à un calcul de valeur absolue de r1, puisqu’un nombre est inversé indifféremment de son signe.
e) La retranscription de la séquence donne:
Le programme inverse r1 indifféremment de son signe puis, si le résultat est positif ne fait plus rien, autrement il inverse le signe une deuxième fois. La séquence e) correspond donc bien à un calcul de valeur absolue.
Retranscrivons le programme dans un langage plus simple.
D’après le code ci-dessus, nous voyons que si r1 < r2, alors r3 est assigné à r2, sinon r3 est assigné à r1. Donc la séquence d’instructions trouve le maximum entre deux valeurs r1 et r2, puis assigne cette valeur à r3, ce qui correspond à la réponse e).
1. À la fin de l’exécution de ce programme, les registres contiennent les valeurs suivantes:
2. Ce programme trie les 4 valeurs contenus dans les registres r1, r2, r3 et r4 en ordre croissant. À la fin de l’exécution du programme, r1 represente le chiffre le plus petit et r4 le chiffre le plus grand. On peut le constater plus facilement en analysant le comportement des séquences aux lignes suivantes:
3. En remplaçant toutes les instances de jump_smallerequal par jump_smaller, nous éviterons d’exécuter
des instructions inutiles dans le cas où les valeurs contenus dans des registres adjacents (r1 et r2, r2 et
r3, r3 et r4) sont identiques. Notre programme s’exécuterait alors plus rapidement sans aucun changement dans le résultat car cela permettrait d’éviter l’échange du contenu de 2 registres contenant la
même valeur.
Le programme ci-dessous calcule la somme des valeurs absolues de deux nombres contenus dans r1 et r2, et le résultat est écrit dans r3.
1: jump_smallerequal 0, r1 , 3
2: subtract r1 , 0, r1
3: jump_smallerequal 0, r2 , 5
4: subtract r2 , 0, r2
5: add r3 , r1 , r2
Le comportement du programme peut être compris en étudiant les séquences de lignes suivantes:
Notez que le code pour obtenir la valeur absolue d’un nombre est le même que celui utilisé dans l’exercice 1.
En observant le schéma du circuit, nous constatons:
Donc la table de vérité correspondant au circuit est la table b).