TP1 : 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.

1. 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 :

2. Registres

La machine possède huit registres dont les noms apparaissent en bas du panneau de contrôle ; pour l'instant on utilisera seulement les quatre premiers ; 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).

2.1. Instructions d'affectation

2.2. Instructions arithmétiques

Les instructions arithmétiques portent toujours sur deux registres ; on utilisera addl, subl, andl, xorl. L'instruction

addl %eax, %ecx

ajoute le contenu du premier registre au second ; le premier registre est inchangé, le résultat de l'addition est placé dans le second.

2.3. Exercice

  1. Ecrire un programme qui place les valeurs 5 et 22 dans les deux premiers registres, puis calcule leur somme dans le troisième registre, sans modifier les deux premiers. Ce programme sera sauvé dans le fichier ex1.ys, dans le répertoire seq.

    Compiler ce programme : make ex1.yo ; charger ex1.yo dans le simulateur (bouton Load en haut de la fenêtre du code) ; exécuter pas à pas, en observant attentivement le panneau de contrôle (et la fenêtre du code) ; le bouton Reset permet de relancer l'exécution.

  2. Ajouter au programme les instructions nécessaires pour tester les autres instructions arithmétiques ; ne pas oublier de le recompiler avant de le recharger et de l'exécuter.
  3. Les codes de conditions se trouvent en bas à droite du panneau de contrôle. On s'intéresse au premier, noté Z (Zero) ou ZF (Zero Flag) ; quelle est la condition sur le contenu de deux registres pour que leur conjonction (andl) soit nulle ? Construire un exemple et le tester en adaptant le programme ex1.ys .

    Même question avec la disjonction exclusive (xorl).

3. Sauts et boucles

Une instruction peut être précédée d'une étiquette, par exemple :

boucle: addl %eax, %ecx

après quoi l'instruction

jmp boucle

place dans le compteur de programme PC l'adresse de l'instruction correspondante. On peut faire aussi des sauts conditionnels en remplaçant jmp par je (jump if equal) ou jne (jump if not equal) : le saut est exécuté ou non suivant la valeur du code de condition ZF.

3.1. Exercice

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 fibo.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 fibo.ys pour qu'il s'arrête après avoir calculé 16 termes de la suite.