Le but de ce TD est de se familiariser avec la génération de code Jasmin.
Jasmin
Jasmin est un assembleur open-source pour créer des fichiers classes à partir d'une syntaxe ressemblant à de l'assembleur et lisible en ASCII.
Il utilise des ensembles d'instructions de la Machine Virtuelle Java.
Télécharger l'archive jasmin.jar.
Vous pouvez vous aider du guide officiel et d'un tutoriel basé sur des exemples.
Il existe aussi un cours intéressant.
Nous vous conseillons d'utiliser la liste des instructions décrites ici.
Récupérer l'exemple simple suivant (que l'on mettra dans un fichier hello.j).
Générer un fichier class à l'aide de la commande suivante:
java -jar jasmin.jar hello.j
Exécuter la classe générée.
Traduire manuellement en Jasmin le code C ci-dessous.
Indication : pour vous aider, faire une simulation d'exécution avec une pile.
Quel est la taille maximale de la pile?
exo1b.j:
Exercice 2 - Génération avec visiteur
Le but de l'exercice est d'écrire un visiteur qui génère le code Jasmin correspondant au petit langage (reconnu par la grammaire du td précédent).
Le code Jasmin comprendra le calcul et l'affichage des variables.
Suivre les instructions suivantes:
Télécharger l'archive gc-ir2-td5.zip.
Le but est d'écrire un visiteur GeneratorVisitor qui devra générer le code Jasmin correspondant au script entrée (reconnu par la grammaire dans td5.ebnf).
Affichage du nom des variables
Compléter le visiteur pour qu'il génère du code Jasmin permettant d'afficher le nom des variables lors de leur déclaration. On supposera que la taille de la pile et le nombre de variables sont fixés!
Opérations sur les réels
Compléter le visiteur pour qu'il génère le code Jasmin permettant de calculer les expressions arithmétiques sur les réels (+,-,*)
et d'afficher le résultat pour chacune des variables (ex. let x = 2.1 + 7 * 6;). On supposera pour l'instant que les expressions ne peuvent pas contenir de variables!
Utilisation des variables
Compléter le visiteur pour, maintenant, tenir compte des variables (ex. let y = 1 - x * 6;). Attention: un réel prend 2 places (2 registres) et un booléen (en fait, un entier) prend 1 place!.
Calcul des expressions d'égalité et d'inégalité
Traiter maintenant le cas des expressions d'égalité et d'inégalité (ex. let z = y == 7 != false;).
Indication: il existe deux cas à traiter: le cas où les opérandes sont des booléens et le cas où ce sont des réels. Attention: dorénavant, les variables peuvent être soit des réels soit des booléens!!
Gestion des if
Gérer maintenant les expressions contenant des if (ex. let w = 5.1 + if(z == true) 3 else 1;).
Taille de pile et nombre de registres
Calculer dynamiquement la taille de la pile et le nombre nécessaire de registres.