Architecture des ordinateurs
Frédéric Mallet Licence Informatique L3 2006/2007
Exercice 5.2 – Modes d'adressage direct et section de données.
On veut maintenant exécuter le même programme avec des valeurs différentes.
1. Essayer d'utiliser la commande enter pour modifier directement dans le programme une des
valeurs (ex., on effectuera 8+3+5x2 au lieu de 8+5+3x2).
2. Proposer une solution, en réalisant un autre programme assembleur qui utilise une section de
donnée et les modes d'adressage direct. Comparer la taille des instructions utilisées avec la
solution précédente. On mémorisera le résultat dans la mémoire (section de données non
initialisées .bss). On utilisera la commande
file secinfo
pour déterminer l'adresse des zones
de données et vérifier que le programme fait bien ce qu'il est supposé faire.
3. On pourra constater que ça n'a pas l'air de fonctionner correctement, désassembler votre
programme pour identifier le bug de ald et constater que le résultat est en réalité correct.
4. Ré-exécuter plusieurs fois le même programme avec des valeurs différentes sans sortir de
l'environnement ald (commande enter). On essaiera en particulier d'exécuter l'opération
8 + 5 + 3 x -2. Que se passe-t-il?
5. Proposer une solution qui utilise l'instruction imul.
6. Pour mettre en évidence l'importance de faire la différence entre mul et imul on réalisera un
programme qui effectue l'opération (3x-2)/2 en utilisant l'instruction div puis l'instruction idiv.
Exercice 5.3 – Calcul du maximum dans un tableau
On veut maintenant réaliser un programme qui calcule la valeur maximum dans un tableau
d'octets.
1. Écrire un programme assembleur qui réalise ce comportement, on utilisera les instructions loop,
cmp et js. Tester votre programme avec le tableau 0x43, 0x56, 0x5, 0x60, 0x80, 0x12, 0x9.
2. Utiliser la directive de compilation $ pour calculer la taille du tableau sans effort.
3. Tester votre programme avec le tableau 0x43, 0x56, 0x5, 0x60, 0x-80, 0x12, 0x9. Quel est le
résultat obtenu ?
4. Corriger votre programme pour qu'il accepte des nombres négatifs. Quels sont les avantages et
inconvénients de faire ça ?
Exercice 5.4 – L'unité nombres réels (FPU)
On veut réaliser un programme qui utilise le FPU pour calculer le cosinus et le sinus de PI et PI/2.
Ne pas oublier d’initialiser le FPU avec l’instruction FINIT avant toute opération.
1. Réaliser un premier programme qui réalise le calcul sur PI, en utilisant les instructions FLDPI,
FSIN, FCOS et FSTP pour faire le calcul et mémoriser le résultat dans la mémoire. Attention à
manipuler des données de la bonne taille. Commenter sur la précision obtenue pour sinus de PI.
2. Modifier ce programme pour réaliser le calcul sur PI/2. Utiliser la commande examine pour
vérifier que le codage de 2 est correct. On utilisera successivement FDIV et FIDIV.
3. Améliorer votre programme en utilisant la commande FSINCOS.
4. On veut maintenant comparer le gain obtenu. Pour cela il faut répéter les opérations plusieurs
fois (plus de 16 millions de fois sur mon ordinateur) pour obtenir une différence significative. On
terminera le programme par :
MOV EAX,1
MOV EBX,0
INT 0x80
pour le rendre exécutable sans l'utilisation de ald (on expliquera ce bout de code au prochain
TP).
5. Utiliser la commande unix time pour comparer les performances des 2 solutions.