Compilation Tps 1 2

Compilation Tps 1 2

Module EISE4 : Compilation TPS 1 & 2 : Machine virtuelle, Assembleur, Structures de données de manipulation d’arbres Ce premier TP est consacré à l’écriture en langage C de trois modules importants de la chaine de compilation : la machine virtuelle, l’assembleur, et les fonctions C consacrées à la création et au parcours d’arborescences que sont les ASA (Arbres de Syntaxe Abstraite, Abstract Syntax Tree ou AST en anglais). Chaque module fait l’objet d’une partie de ce long TP nécessaire pour disposer de toute la partie « back la liste de toutes les i reconnues par la ma ne or 14 PARTIE I : La machin

La machine virtuelle evm. c, prend un fichier langage n annexe se trouve Virtual Machine). fichier source dans machine en paramètre, l’ouvre, et exécute les instructions qui s’y trouvent. Ce fichier langage machine, pour la lisibilité, est en fait un fichier texte qui a la structure suivante : nombre total instructions O : instructionO : instructionl nombre total instructionsl : instruction nombre total instruction sl Ainsi, le fichier el. bin suivant : 10 0:100 nouveau push 2 aux adresses 5 et 6, une instruction add ? l’adresse 7, une instruction output en 8 et l’instruction d’arrêt

Désolé, mais les essais complets ne sont disponibles que pour les utilisateurs enregistrés

Choisissez un plan d'adhésion
de a machine virtuelle halt à l’adresse 9.

L’exécution de ce code machine dot afficher la valeur 22. 0 ? l’écran. IJne des fonctions vous allez écrire, readAssembly(FlLE *fin), doit lire le contenu de ce fichier et stocker les entiers correspondants aux instructions dans le tableau codeSegment. Les 7 premières questions du TP se trouvent dans le fichier evm. c fourni. Les suivantes sont . Q8) pour tester votre EVM, Décrypter le fichier eZbin fourni suivant : 29 0:302 1:105 3:112 4:117 5:116 6:32 7:1 12 8:117 9:105 10:115 12:111 13:117 14:116 5112 16:117 17:116 18:0 19:14 20:1 2 texte, terminée par une dernière l’gne contenant la pseudo instruction end.

Quand la boucle de parcours de cette suite de lignes découvre la Ilgne contenant end, le code assembleur est considéré comme entièrement lu, et les deux passes d’assemblage proprement dites commencent. L’assembleur que vous allez réaliser est un assembleur deux passes. La première va effectuer une traduction des instructions décrites sous forme de chaîne de caractères dans le fichier . asm (avec arguments ou sans) dans les entiers correspondants (avec arguments entiers ou pas, en parfaite orrespondance avec le texte assembleur).

Cette passe correspond à la génération du code machine à partir du texte source assembleur. Si une instruction de rupture de séquence (un saut ou un call) fait référence à une étiquette qui n’a pas été encore rencontrée dans le texte assembleur, cette première passe prend note de l’endroit exact dans le code généré ou il manque des informations et ajoute une référence non résolue à la table des références non encore résolues.

Si la ligne assembleur décodée est une déclaration d’étiquette (etiql : par xemple), cette étiquette est déclarée (sans le caractère dans la table des étiquettes et sera exploitée dans la passe 2 de résolution des références inconnues. Une fois la passe 1 terminée, le code généré possède sa taille finale, mais présente des « trous » pour chaque référence non résolue. Il suffit alors d’utillser conjointement la table des étiquettes et la table des références pour remplacer ces trous par leurs valeurs exactes. Exemple Si l’on prend le code assembleur d’entrée suivant : debut: push O input cont pushr 10. gt Il outchar i’>l O » halt outchar « <10" end a première phase d'assemblage va produlre le code langage machine suivant : La ligne 9, qui contient une instruction de saut si faux jfvers une étiquette qui n'a pas encore été vue par l'assembleur puisqu'elle se trouve à la ligne 1 1, va se traduire par la génération du code suivant 0:14 2:100 4:300 5:100 2 l'étiquette stockée, de retrouver celle-ci dans la table des étiquettes, de récupérer l'adresse absolue correspondante, et de stocker celle-ci à l'adresse correspondante dans le code (et donc d'écraser la valeur -1 mise précédemment de manière temporaire avec la bonne adresse).

Pour réaliser l’assembleur, on va avoir besoin de 4 structures de données – le segment de code, codeSegment – la table des etiquettes, tabLabels – la table des références, tabReferences – la table des mots-clés représentant les instructions, tab Instruction Names Les structures de données C correspondantes sont fournies, avec explications, dans le fichier asm. c. Ily a 11 questions dans ce fichier asm. c, qu’il faut traiter dans l’ordre. QI 2) Valider le bon fonctionnement de votre assembleur avec un fichier -asm testant l’ensemble des instructions. PARTIE 3 . Fonctions de manipulatlon d’arborescences Dans cette partie, il s’agit d’écrire des fonctions C permettant de créer et de parcourir des arborescences afin de générer du code assembleur que l’on pourra assembler et exécuter ensuite avec la machine virtuelle. Avant d’écrire ces fonctions dans les fichiers ast. h et ast. , il faut prendre le temps d’étudier et d’apprécier un outil génial disponible partout et notamment sur les machines de TP, l’outil dot. dot est un logiciel qui, à partir d’une description textuelle d’un graphe (orienté ou non), est capable d’en produire une représentation graphique, par exemple au format png. Par exemple, si lion écrit le fichier res. dot suivant . PAGF s OF exemple au format png. Par exemple, si l’on écrit le fichier res. dot suivant NOOO -230000″] NOOI N003 digraph { N002 [label- N004 [label* N005 [label= « output »] NOOS > N004 N004 N002 N004 > NOCE N002 NOOO N002 > NOOI et qu’on lance ensuite la commande . dot Tpng res. dot o res. png on obtient le fichier res. png suivant : ce qui, vous l’admettrez, est super cool pour vite visualiser un AST.

La syntaxe d’un tel fichier est simple Après une première ligne disant qu’il s’agit d’un « directed graph » digraph, on définit dans un premier emps taus les nœuds de l’arborescence en les numérotant (nœuds NOOO à NOOS) et en leur associant un label entre [J. Dans un deuxième temps, on définit les arcs entre les nœuds avec des lignes comme N004 N002, qui signifie N004 a pour fils N002. Les structures de donnée PAGF ruire les arbres vont être O et le fils 1) ou l’opération « output P. De cette manière, on pourra créer un AST contenant des expressions arithmétiques faisant intervenir les opérateurs classiques et des constantes réelles, et l’opérateur « output » nous permettra d’afficher le résultat de cette expression ? ‘écran. Les questions relatives à cette partie se trouvent dans les fichiers ast. et ast. c. L’objectif affiché est de vous permettre, à partir d’un AST que vous aurez construit, de générer le code assembleur correspondant . asm et de l’exécuter avec l’EVM. : Les instructions assembleur de la EISE Virtual Machine Annexe 1 Les instructions arithmétiques et logiques effectuent des opérations de calcul sur des mots mémoire situés au sommet de la pile d’exécution. Elles ne nécessitent pas d’opérande car ceux-ci se trouvent déjà dans la partie haute de la pile (sous sommet et sommet de ile). Le compteur ordinal incrémenté d’une unité à la fin de chacune de ces instructions. Voici le détail de ces instructions .

ADD les deux opérandes au sommet de la pile sont additionnés et remplacés par le résultat de l’addition. Le pointeur de pile est décrémenté dune unité. SUB l’opérande au sommet de la pile est soustrait de l’opérande juste en dessous du sommet. Ces deux opérandes sont remplacés par le résultat de la soustraction. Le pointeur de pile décroit d’une unité. MULT les deux opérandes du sommet de la pile sont multipliés et remplacés par le résultat de la ultiplication. Le pointeur de pile décroît d’une unité. DIV l’opérande juste en dessous du somme 7 2 DIV l’opérande juste en dessous du sommet de la pile est divisé par l’opérande du sommet de la pile.

Ces deux opérandes sont remplacés par le résultat de la division. Le pointeur de pile décroît d’une unité. Dans le cas où le diviseur vaut O, une erreur est détectée et l’exécution est arrêtée. POW l’opérande juste en dessous du sommet de la pile est calculé à la puissance donnée par l’opérande du sommet de la pile. Une erreur d’exécution est provoquée en cas de calcul athématique faux. Les deux opérandes du sommet de la pile sont remplacés par le résultat de l’opération. Le pointeur de pile décroît d’une unité. NEG (NEGate) le signe de l’opérande au sommet de la pile est inversé. Le pointeur de pile reste inchangé.

AND une opération logique et est effectuée entre les deux opérandes du sommet de la pile. Le résultat de cette opération remplace les deux opérandes au sommet de la pile. Le pointeur de pile décroit d’une unité. OR une opération logique ou est effectuée entre les deux NOT l’opération logique non est effectuée sur l’opérande au ommet de la pile, c’est-à-dire que si l’opérande vaut faux, il devient vrai et inversement. La valeur O est interprétée comme faux, les autres valeurs comme vrai. Le pointeur de pile reste inchangé. EQ (EQual) les deux opérandes au sommet de la pile sont dépilés et s’ils sont égaux, reste inchangé. t s’ils sont égaux, la valeur logique vrai 1 est placée sur le sommet de la pile, autrement c’est la valeur logique faux O. Le pointeur de pile décroît dune unité. LS (LesS) les deux opérandes au sommet de la pile sont dépilés et si l’opérande juste en dessous du ommet est strictement inférieur à l’opérande du sommet, la valeur logique vrai 1 est placée sur le sommet de la pile autrement c’est la valeur logique faux O. Le pointeur de pile décroît d’une unité. GT (Greater Than) les deux opérandes au sommet de la pile sont dépi és et si l’opérande juste en dessous du sommet est strictement supérieur à l’opérande du sommet, la valeur logique vrai 1 est placée sur le sommet de la pile, autrement c’est la valeur logique faux O.

Le pointeur de pile décroît d’une unité. Les instructions de manipulation de la pile effectuent des pérations sur les mots mémoire situés au sommet de la pile d’exécution. Voici le détail de ces instructions: DEC op cette instruction décrémente le pointeur de pile SP de la valeur de l’opérande. Le compteur ordinal est incrémenté de 2. INC op cette instruction incrémente le pointeur de pile SP de la PUSH op l’opérande est placé sur le sommet de la pile. Le pointeur de pile croît d’une unité. Le compteur ordinal est incrémenté de 2. PLJSHR op l’opérande est en fait constitué dune suite de caractères terminée par le caractère O. Cette suite représente un nombr