Université Bordeaux 1 INF155, jeudi 18 mars 2010 Licence de Sciences et Technologie Architecture des ordinateurs
Devoir surveillé numéro 1
Exercice 1 Un encodeur avec priorité 3×2 est un circuit avec trois entrées a1, a2, a3 et deux sorties x1, x0 qui codent en binaire le numéro de la dernière entrée non nulle. Par exemple si a1 =a2 = 1 et a3 = 0, le numéro de la dernière entrée non nulle est 2, et x1x0 = 10 ; si les trois entrées sont nulles, les sorties aussi.
Ecrire des formules booléennes aussi simples que possible qui expriment les sorties en fonction des entrées, puis dessiner un circuit qui réalise cet encodeur.
Exercice 2 Cet exercice propose l’analyse progressive du programme ds1.yo situé au verso de cette feuille. Pas de panique, inutile de commencer par lire en détail ce programme, et la plupart des questions sont indépendantes.
La fonctionmap est une fonction à deux argumentstetn, qui appliquef à chacun desnéléments d’un tableaut; autrement ditt1, t2, . . . tnsont remplacés par f(t1), f(t2), . . . f(tn).
Pour que le programme et les questions figurent sur des feuilles séparées, les questions commencent page 3.Attention : les réponses qui n’apportent aucune information nouvelle par rapport à ce qui est déjà écrit noir sur blanc dans le programme ne rapportent aucun point ; par exemple si la question est
“à quoi sert l’instruction pushl %eax?”, la réponse “cette instruction sert à empiler le registre eax”
n’est pas une bonne réponse. . .
1
Programme ds1.yo
0 x 0 0 0 : 3 0 8 4 0 0 0 2 0 0 0 0 | m a i n : i r m o v l 0 x200 ,% esp
0 x 0 0 6 : 2 0 4 5 | r r m o v l % esp ,% ebp
0 x 0 0 8 : 5 0 0 8 0 0 0 1 0 0 0 0 | m r m o v l p ,% eax
0 x 0 0 e : a 0 0 8 | p u s h l % eax
0 x 0 1 0 : 3 0 8 0 0 4 0 1 0 0 0 0 | i r m o v l u ,% eax
0 x 0 1 6 : a 0 0 8 | p u s h l % eax
0 x 0 1 8 : 801 e 0 0 0 0 0 0 | c a l l map
0 x 0 1 d : 10 | h a l t
0 x 0 1 e : a 0 5 8 | map : p u s h l % ebp
0 x 0 2 0 : 2 0 4 5 | r r m o v l % esp ,% ebp
0 x 0 2 2 : 5 0 1 5 0 c 0 0 0 0 0 0 | m r m o v l 1 2 ( % ebp ) ,% ecx
0 x 0 2 8 : 6 2 1 1 | a n d l % ecx ,% ecx
0 x 0 2 a : 716 c 0 0 0 0 0 0 | jle L3
0 x 0 2 f : a 0 3 8 | p u s h l % ebx
0 x 0 3 1 : 5 0 3 5 0 8 0 0 0 0 0 0 | m r m o v l 8(% ebp ) ,% ebx 0 x 0 3 7 : 5 0 2 3 0 0 0 0 0 0 0 0 | L1 : m r m o v l (% ebx ) ,% edx
0 x 0 3 d : a 0 1 8 | p u s h l % ecx
0 x 0 3 f : a 0 2 8 | p u s h l % edx
0 x 0 4 1 : 8 0 7 1 0 0 0 0 0 0 | c a l l f
0 x 0 4 6 : b 0 2 8 | p o p l % edx
0 x 0 4 8 : b 0 1 8 | p o p l % ecx
0 x 0 4 a : 4 0 0 3 0 0 0 0 0 0 0 0 | r m m o v l % eax ,(% ebx ) 0 x 0 5 0 : 3 0 8 2 0 1 0 0 0 0 0 0 | i r m o v l 1 ,% edx
0 x 0 5 6 : 6 1 2 1 | s u b l % edx ,% ecx
0 x 0 5 8 : 736 a 0 0 0 0 0 0 | je L2
0 x 0 5 d : 3 0 8 2 0 4 0 0 0 0 0 0 | i r m o v l 4 ,% edx
0 x 0 6 3 : 6 0 2 3 | a d d l % edx ,% ebx
0 x 0 6 5 : 7 0 3 7 0 0 0 0 0 0 | jmp L1
0 x 0 6 a : b 0 3 8 | L2 : p o p l % ebx
0 x 0 6 c : 2 0 4 5 | L3 : r r m o v l % esp ,% ebp
0 x 0 6 e : b 0 5 8 | p o p l % ebp
0 x 0 7 0 : 90 | ret
0 x 0 7 1 : 5 0 0 4 0 4 0 0 0 0 0 0 | f : m r m o v l 4(% esp ) ,% eax
0 x 0 7 7 : 2 0 0 1 | r r m o v l % eax ,% ecx
0 x 0 7 9 : 6 0 1 1 | a d d l % ecx ,% ecx
0 x 0 7 b : 6 0 1 1 | a d d l % ecx ,% ecx
0 x 0 7 d : 6 0 1 0 | a d d l % ecx ,% eax
0 x 0 7 f : 90 | ret
0 x 1 0 0 : | . pos 0 x 1 0 0
0 x 1 0 0 : 0 5 0 0 0 0 0 0 | p : . l o n g 5 0 x 1 0 4 : 0 3 0 0 0 0 0 0 | u : . l o n g 3
0 x 1 0 8 : 0 4 0 0 0 0 0 0 | . l o n g 4
0 x 1 0 c : 0 8 0 0 0 0 0 0 | . l o n g 8
0 x 1 1 0 : 0 e 0 0 0 0 0 0 | . l o n g 14
0 x 1 1 4 : 2 a 0 0 0 0 0 0 | . l o n g 42
2
Questions.
1. Dans le programme ds1.yole code de la fonctionf commence à l’adresse 0x071 ; que calcule-t- elle, autrement dit que vautf(x) ?
Les questions suivantes portent sur la fonction main (instructions d’adresses 0x000 à 0x01d) ; pour répondre à ces questions il est inutile (et même fortement déconseillé) de lire le code demap.
2. Expliquer pourquoi l’instruction d’adresse 0x008 est une instruction mrmovl alors que celle d’adresse 0x010 est une instruction irmovl. A quoi servent les deux instructions pushl dans la fonctionmain?
3. Voici le contenu de la pile et des registresjuste après exécution de l’instructioncall mappar le simulateur Y86 (qui est donc prêt à exécuter la première instruction de la fonctionmap) :
Expliquer en détail les valeurs de chaque mot de la mémoire et de chaque registre (non nul).
4. Lorsque le programme s’arrête (instruction halt), quel est le contenu de la mémoire à partir de l’étiquetteu (adresses 0x104 et suivantes) ? La réponse doit comporter pour chaque mot son adresse et sa valeur décimale.
5. Voici un cliché (partiel) de la mémoire une fois le programme exécuté :
Comparer ce cliché avec la réponse à la question précédente, endétaillant pour chaque mot (non nul) comment convertir en décimal sa représentation hexadécimale.
Les questions suivantes portent sur la fonctionmap.
6. Quel est le rôle de l’instruction d’adresse 0x022 : mrmovl 12(%ebp),%ecx? Que contient le re- gistre%ecxpendant l’exécution de la fonctionmap? Expliquer le rôle des instructions d’adresses 0x050 à 0x058 :
i r m o v l 1 ,% edx s u b l % edx ,% ecx
je L2
3
7. Quel est le rôle de l’instruction d’adresse 0x031 :mrmovl 8(%ebp),%ebx? Que contient le registre
%ebxpendant l’exécution de la fonctionmap? Quand est-il incrémenté, de combien, et pourquoi ? 8. Pourquoi le registre %ebx est-il sauvegardé avant d’être utilisé ? Quand est-il restauré ? Si on supprime les deux instructions correspondantes, ce programme fonctionne-t-il correctement (il ne suffit pas de répondre par oui ounon, il faut justifier la réponse) ?
9. Il reste à analyser le coeur de la fonction map : L1 : m r m o v l (% ebx ) ,% edx
p u s h l % ecx p u s h l % edx
c a l l f
p o p l % edx p o p l % ecx
r m m o v l % eax ,(% ebx )
(a) Expliquer le rôle de la première et de la dernière instruction, et pourquoi on utilise le registre
%eax dans la dernière instruction.
(b) La fonctionf possède un seul argument, or on empile et dépile deux registres : expliquer ce mystère, et ce qui se passerait si on se contentait d’empiler et de dépiler l’argument def. Et pour ceux qui s’ennuieraient une belle image — et une dernière question. . .
10. Expliquer à quelle étape de l’exécution du programme a été pris le cliché ci-dessous, ainsi que le contenu de la pile et des registres à cet instant.
Feuille mise à jour le 17 mars 2010
4