Université BORDEAUX 1 |
U.F.R. Mathématiques et Informatique |
Licence Informatique 2ème année |
2 mars 2009 |
Devoir surveillé
INF 155 - Architecture de l'ordinateur
Durée: 1h30. Devoir sans document.
Travaillez calmement, il est normal que
vous ne répondiez pas à certaines questions. Huit questions
bien traitées rapportent beaucoup plus de points
que douze questions maltraitées !
On considère des entiers codés sur 16 bits et interprétés comme
des entiers relatifs (codés en complément à deux) ;
dans tout l'exercice on utilise
4 chiffres hexadécimaux pour écrire ces entiers.
M |
N |
P |
Q |
R |
ba4e |
fe3d |
6190 |
3cc6 |
89f0 |
- Parmi ces cinq entiers quels sont ceux qui sont négatifs ?
Classer ces entiers du plus petit au plus grand,
par exemple :
M < P
< R < N < Q
(mais cette réponse tirée au hasard
n'est probablement pas la bonne).
Justifier la réponse sur la copie.
- Calculer M + N :
effectuer l'addition directement en hexadécimal
sur la copie
— une réponse brute ne rapportera aucun point.
Y a-t-il débordement (overflow) ?
- Calculer -N et M - N ;
comme dans la question précédente le détail des
calculs doit figurer sur la copie.
0x000: 308400010000 | init: irmovl Stack, %esp
0x006: 308500010000 | irmovl Stack, %ebp
0x00c: 7024000000 | jmp Main
|
0x014: | .align 4
0x014: 0d000000 | array: .long 0xd
0x018: c0000000 | .long 0xc0
0x01c: 000b0000 | .long 0xb00
0x020: 00a00000 | .long 0xa000
|
0x024: 308004000000 | Main: irmovl 4,%eax
0x02a: a008 | pushl %eax
0x02c: 308214000000 | irmovl array,%edx
0x032: a028 | pushl %edx
0x034: 803a000000 | call Sum
0x039: 10 | halt
|
0x03a: a058 | Sum: pushl %ebp
0x03c: 2045 | rrmovl %esp,%ebp
0x03e: 501508000000 | mrmovl 8(%ebp),%ecx
0x044: 50250c000000 | mrmovl 12(%ebp),%edx
0x04a: 308000000000 | irmovl 0, %eax
0x050: 6222 | andl %edx,%edx
0x052: 7374000000 | je End
|
0x057: 506100000000 | Loop: mrmovl (%ecx),%esi
0x05d: 6060 | addl %esi,%eax
0x05f: 308304000000 | irmovl 4,%ebx
0x065: 6031 | addl %ebx,%ecx
0x067: 3083ffffffff | irmovl -1,%ebx
0x06d: 6032 | addl %ebx,%edx
0x06f: 7457000000 | jne Loop
|
0x074: b058 | End: popl %ebp
0x076: 90 | ret
|
0x100: | .pos 0x100
0x100: | Stack: # The stack goes here
Voici ci-contre le texte du programme de démonstration fourni
avec le simulateur Y86,
dont on a malencontreusement effacé les commentaires (sauf le dernier).
- Que se passerait-il lors de l'exécution du programme
si par malheur on avait oublié l'instruction
jmp Main d'adresse 0x00c ?
- Quels sont les paramètres de la fonction Sum ?
Expliquer quelle est la partie du code qui permet de répondre
à cette question.
- Expliquer les trois instructions consécutives d'adresses
0x03e, 0x044 et 0x04a ;
en déduire le rôle des trois registres
%eax, %ecx, et %edx pendant l'exécution de la fonction Sum.
- Expliquer les sept instructions qui composent la boucle
— adresses
0x057 à 0x06f.
Attention : les réponses qui paraphrasent
le code (on ajoute %esi à %eax, etc.) ne rapportent aucun point ;
il faut rédiger clairement, en choisissant correctement les noms
des variables manipulées par le programme.
En déduire ce que calcule la fonction Sum.
- Où se trouve le résultat calculé par la fonction
Sum ? Quelle est sa valeur (en hexadécimal) ?
- Si ce code avait été produit par un compilateur
quelle aurait été la déclaration
(en langage C) de la fonction Sum ?
- Expliquer le rôle des deux instructions d'adresses
0x03a et 0x03c au début de la fonction Sum.
Expliquer de même
le rôle des deux instructions d'adresses
0x074 et 0x076 en fin de fonction.
- Expliquer le rôle des deux instructions d'adresses
0x050 et 0x052.
Donner une instruction qui remplacerait avantageusement
(pourquoi ?) l'instruction qui les précède
(adresse 0x04a).
- Décrypter le code machine 50250c000000
(instruction d'adresse 0x044).
Conseil : examiner le code machine
des instructions similaires et expliquer
en détail sur la copie comment raisonner pour retrouver
le code-opération et la numérotation (exotique) des registres.
Ecrire en langage d'assemblage Y86 une fonction
cmp telle que l'appel
call cmp
permette de comparer les deux registres %eax et %ecx
sans les modifier.
call cmp
jl boucle
Par exemple le code ci-contre doit déclencher un saut
vers l'instruction d'étiquette boucle
si le contenu du registre %eax
est strictement inférieur au contenu du registre %ecx.
Les valeurs de tous les registres doivent être
identiques avant et après exécution
de ce fragment de code.
Note : la solution est très courte (environ
cinq instructions).