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 !

Exercice 1

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
  1. Parmi ces cinq entiers quels sont ceux qui sont négatifs ?
  2. 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.

  3. 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) ?
  4. Calculer -N et M - N ; comme dans la question précédente le détail des calculs doit figurer sur la copie.

Exercice 2

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).

  1. Que se passerait-il lors de l'exécution du programme si par malheur on avait oublié l'instruction jmp Main d'adresse 0x00c ?
  2. Quels sont les paramètres de la fonction Sum ? Expliquer quelle est la partie du code qui permet de répondre à cette question.
  3. 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.
  4. 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.
  5. Où se trouve le résultat calculé par la fonction Sum ? Quelle est sa valeur (en hexadécimal) ?
  6. Si ce code avait été produit par un compilateur quelle aurait été la déclaration (en langage C) de la fonction Sum ?
  7. 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.
  8. 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).
  9. 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.

Exercice 3

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).