Premiers pas en assembleur

Le modèle de machine choisi est celui du cours Computer Systems: A Programmer's Perspective ; il s'agit d'une version simplifiée des processeurs Intel, appelée Y86 par référence à l'architecture x86.

Installation du simulateur

Commencer par créer un répertoire Archi et travailler toujours dans ce répertoire.

Si tout s'est bien passé, plusieurs simulateurs ont été créés, le plus simple est un simulateur séquentiel situé dans le répertoire seq :

Si tout s'est bien passé, trois fenêtres apparaissent :

Registres

La machine possède huit registres dont les noms apparaissent en bas du panneau de contrôle ; leurs noms et l'ordre dans lequel ils apparaissent sont curieux, mais on s'y fait vite (cette anomalie résulte de l'évolution historique des processeurs Intel, en particulier du passage des processeurs 16 bits aux processeurs 32 bits).

Exercice 1

La suite de Fibonacci est définie par récurrence :

u1 = u2 = 1 , et pour n > 0 : un+2 = un+1 + un .

Les premiers termes de la suite sont donc 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, etc.

  1. Ecrire un programme qui calcule les termes successifs de la suite de Fibonacci avec une boucle simple — équivalente à une boucle while (1) en langage C. Sauver ce programme dans le fichier tp1.ys .

    Après avoir compilé et chargé ce programme dans le simulateur, procéder à une exécution pas à pas, puis à vitesse lente.

  2. L'instruction halt stoppe la simulation en cours. Modifier le programme tp1.ys pour qu'il s'arrête après avoir calculé 16 termes de la suite.

Exercice 2

  1. Ecrire un programme qui lit un compteur n stocké en mémoire juste après le code, et écrit les n premiers nombres de la suite de Fibonacci dans la partie de la mémoire qui suit le compteur n. Sauver ce programme dans le fichier tp2.ys et le tester avec le simulateur. Veiller à ce que le programme soit correct, même pour n = 0.

    Attention : l'étiquette de n doit être précédée de la directive .align 4 pour que l'adresse correspondante soit un multiple de 4.

  2. Quel est le plus grand nombre de Fibonacci représentable sur 32 bits ? Modifier le programme pour que le calcul soit arrêté dès que ce nombre est atteint, lorsque n est trop grand.

Exercice 3

A la fin de l'exercice précédent on dispose d'un tableau d'entiers de taille variable, codé comme suit: le premier entier du tableau contient sa taille, et les éléments suivants constituent le tableau proprement dit. Dans cet exercice, tous les tableaux sont codés ainsi.

  1. Ecrire un programme qui fusionne deux tableaux u et v (de tailles respectives m et n) constitués d'entiers croissants. Le résultat sera un nouveau tableau ordonné de taille m + n .

    Pour tester ce programme on utilisera un tableau u constitué des 10 premiers nombres de Fibonacci (1 1 2 3 5 8 13 21 34 55) et un tableau v constitué des 7 premières puissances de 2 (1 2 4 8 16 32 64). Le résultat de la fusion doit être le tableau suivant, constitué de 17 nombres : 1 1 1 2 2 3 4 5 8 8 13 16 21 32 34 55 64.

    Conseil. Développer ce programme par étapes :

    Tester soigneusement chaque étape avec le simulateur avant de passer à l'étape suivante !

  2. On suppose qu'on veut ensuite, dans le même programme et pour une raison quelconque, augmenter la taille de l'un des deux tableaux u ou v : quel est le problème et comment le résoudre ?

  3. On suppose qu'on veut au contraire, pour une raison quelconque, diminuer la taille de l'un des deux tableaux u ou v ; c'est facile, mais il reste un problème : lequel ?

Exercice 4

Soit un tableau de 32 entiers u0 , u1 , u2u31 et soit pi le bit qui indique la parité de ui . Ecrire un programme qui calcule dans un registre l'entier p dont les chiffres binaires sont les pi .

Conseil : chaque fois qu'on lit un nouvel élément ui , remplacer p par 2 * p ou 2 * p + 1 suivant la parité de ui .