Le but de ce tp est de vous montrer le principe d’une pile, sa gestion et de voir où se trouvent les
différentes données d’un programme.
En même temps, on va voir la taille mémoire occupée par différentes données
déclarées initialisées ou non.
Vous pourrez aussi remarquer le codage des nombres négatifs, et voir que le microprocesseur utilise le complément
à 2, comme nous l'avons vu lors d'un Td du premier semestre.
1h30
La pile est une zone mémoire dans laquelle il est possible de stocker des données temporaires. Dans les deux Tp précédents, vous avez dû remarquer dans les différents sources des programmes que les mêmes lignes de code se trouvaient toujours en début de code source :
En fin de source, on trouve également :
Saisir le programme suivant, écrit en langage C, que vous devez comprendre assez facilement.
Traduisez-le en langage d’assemblage en tapant la commande:
$gcc -Wall -S pile.c
Notez l'utilisation de -Wall qui demande au compilateur C de vous donner des avertissements supplémentaires.
Utilisation recommandée pour TOUTE compilation d'un code C
Visualiser le fichier source en langage d’assemblage.
Faire le dessin de la pile et de l'occupation mémoire.
Conclure sur la taille des différents types.
Changer l’ordre des déclarations de variables (par exemple mettre mh entre mb et mc)
de façon à ne pas les avoir déclarées en ordre de taille croissante.
Le traduire en langage d’assemblage.
Visualiser le fichier source en langage d’assemblage.
Faire le dessin de la pile et de l'occupation mémoire.
Desassembler le fichier objet :
$objdump -d pile.s > pile.dis
Constater le codage des nombres négatifs.
Remplacer les lignes int h
et int mh
respectivement par
static int h
et static int mh
.
Recommencer l’étude précédente et conclure.
Nous allons approfondir un peu notre connaissance sur la pile.
Pour cela je vous invite à saisir le programme suivant :
Ce programme contient deux fonctions, main et appel_fonction.
Sachant que le compilateur C lit votre programme de haut en bas (dans ce sens), expliquer l'avertissement
obtenu pendant la compilation.
Après traduction en langage d’assemblage, on récupère le source suivant :
Analyser le programme pile2.c de façon à comprendre pile2.s.
Donner le nombre de cadres de piles que le programme pile2.s contient,
Expliquer chaque ligne du source assembleur.
Dessiner la zone mémoire de ce programme.
Optimiser le programme pile2.s (option O3) en tapant la commande :
$gcc S -O3 pile2.c -o pile2.opt.s
Vous devez obtenir un source optimisé, et donc beaucoup plus simple, donc plus facile à analyser.
Expliquer chaque ligne du source assembleur.
Dessiner la zone mémoire de ce programme.