0% ont trouvé ce document utile (0 vote)
1 vues3 pages

TP 2

tp1 m1

Transféré par

saidkamalshinwari098
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
1 vues3 pages

TP 2

tp1 m1

Transféré par

saidkamalshinwari098
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Compilation des variables et structures de contrôle

Benoît Barbot

Jeudi 23 octobre 2025

Durant ce TP vous allez implémenter les structures conditionnelles et la gestion des variables. Ce
TP doit être rendu sur le site caseine. org dans la rubrique TP2. Reprener le fichier [Link]
du dernier TP
1 Partie 1 : Structure conditionnelle
Question 1 Modifiez le code de la fonction generate_asm_statement pour gérer correctement le
cas d’un IfStmt qui implémente un test de condition. On compilera les expressions conditionnelles
comme des expressions entières. Vous pourrez utiliser la fonction fresh_lbl(a:String) -> String
qui prend en entrée une chaine de caractère et qui renvoie une chaine de caractère unique (rajoute
un numéro qui s’incrémente). Votre programme doit être capable de compiler le code C suivant :
int main (){ // test3 . c
if (1){ return 0;}
else { return 1;}
}
Soumettez votre fichier, votre programme doit passer tous les tests de la partie 1 (Ceux dons le nom
commmence par P1).

2 Partie 2 : Variables
Dans le fichier [Link] le premier argument de chaque fonction est une liste des variables
déjà définies. Leurs types est VarTable = Vec<(String, String)>, et elles associent à un nom de
varaiable, une adresse sous la forme d’une chaîne de caractere.

Question 2 Dans le fichier [Link], dans la fonction generate_asm_expression, ajouter le


cas d’une variable (Var(String)).
Comme les variables globales sont déjà ajoutées à la liste des variables vous devez pouvoir compiler
le code :
// Fichier test16 . c
long x =0;

int main (){


return x ;
}

1
Benoît Barbot Compilation des variables et structures de contrôle
Vous pouvez utiliser le fait que le type VarTable implémente le trait iterator.
Soumettez votre fichier, votre programme doit passer les tests 16 et 16bis de la partie 2.

Question 3 Gérer le cas de l’assignement des variables dans la fonction generate_asm_expression.


Vous devez pouvoir compiler le code :
// Fichier test24 . c
long x =0;

int main (){


x =2;
return x ;
}
Lisez bien les erreurs que vous obtenez si vous avez des “Pattern matching failed”.
Soumettez votre fichier, votre programme doit passer les tests 24 et 24bis de la partie 2.

Pour la suite, nous allons commencer à manipuler la pile.

Question 4 Modifier la gestion de CompoundStmt pour gérer les variables locales. Chaque variable
doit recevoir un emplacement sur la pile et être ajoutée à la liste des variables avec leurs adresses.
L’adresse d’une variable s’écrie en assembleur pos(%rbp) ou pos est la position relative de la
variable par rapport à la base de la pile.
Le sommet de pile (%rsp) doit être mis à jour en conséquence.
Tester avec les exemples “test5.c, test6.c”.
Soumettez votre fichier, votre programme doit passer tous les tests de la partie 2.

3 Partie 3 : Opération supplémentaire


Cette partie est optionnelle dans le sens qu’elle n’est pas nécessaire pour les prochains TPs.
On rappelle les instructions assembleur suivantes
negq a // calcul la n é gation de a , ( a = -a )
cmpq a1 , a2 // Compare les valeur a1 et a2 et met à jours les drapeaux
sete % al // Met % al à 1 si la derni è re comparaison é tais é gale
setne % al // Met % al à 1 si la derni è re comparaison é tais diff é rente
setns % al // Met % al à 1 si la derni è re comparaison plus grande
setg % al // Met % al à 1 si la derni è re comparaison plus grande strictement
idivq a1 , a2 // Calcul a1 / a2 dans % rax et a1 mod a2 dans % rdx
// % rdx doit etre é gal à 0 avant l ’ appel
andq a1 , a2 // Calcul le et logique de a1 et a2
orq a1 , a2 // Calcul le ou logique de a1 et a2
Le registre %al contient les 8 plus petits bits de %rax (i.e. le plus petit octet) les instructions
sete, setne, setns, setg prennent en argument un registre sur un seul octet. :

2
Benoît Barbot Compilation des variables et structures de contrôle
%rax
%ax

%ah %al
%eax

Question 5 Implémenter la compilation des opérations de comparaison booléenne ; EQ, NEQ, LE, LL.
Soumettez votre fichier, votre programme doit passer le test 1 (Q5_test1.c).

Question 6 Implémenter la compilation des opérations de division entières et les comparaisons


booléennes ; Div, Mod, Or, And.
Soumettez votre fichier, votre programme doit passer les tests 2, 2b, 2t

Question 7 Implémenter la compilation des opérations unaires (UnaryOp) ; Not, MinusM


Soumettez votre fichier, votre programme doit passer tous les tests de la partie 3.

Vous aimerez peut-être aussi