Académique Documents
Professionnel Documents
Culture Documents
INDP2-B
Realisé par :
Saidani Wael
Jmour Mohamed
1
TP2 : C implémenté en Assembleur
Objectif:
Lors de ce TP, vous aller :
Etapes à suivre :
1. Démarrer le programme µVision
2. Ouvrir le projet CinAsmLabList, sélectionner le menu Project, sélectionner la commande
« Open project »
3. Vérifier que le compilateur est configuré pour générer les fichiers listing du code assembleur
(Option -> listing -> C compiler Listing) avec un maximum d’optimisation (Option -> C/C++ ->
Optimization level3 (-O3))
4. Compiler le programme et examiner les fichiers listing générés (dans le répertoire « lst »)
pour pouvoir répondre aux questions du TP.
5. Quel est le contexte sauvegardé (s’il y en a un) après l’entrée dans la fonction list_init ?
PUSH {r4,lr}
6. Quelle est l’instruction qui restore le contexte et assure le retour au programme appelant ?
La commande qui restore le contexte et assure le retour au programme appelant {POP r4 pc}
Le registre qui joue le rôle d’un compteur pour la boucle « for » est r0.
On fait l’initialisation de ce registre à 0 à l’aide de la commande {MOVS r0, #0} .Puis on
l’incrémente à chaque fois par 1 à travers l’instruction {ADDS r0,r0, #1}
2
8. Quelles sont les instructions utilisées pour exécuter l’opération « i * 2000 » ? Expliquer leurs
fonctionnements ?
9. Quelles sont les instructions utilisées pour accéder à l’opérande offset[i] ? Expliquer leurs
fonctionnements ?
10. Quel est le contexte sauvegardé (s’il y en a un) après l’entrée dans la fonction list_find ?
11. Quelle est l’instruction qui restore le contexte et assure le retour au programme appelant ?
Pourquoi elle est différente par rapport à la fonction list_init ?
La commande qui restore le contexte et assure le retour au programe appelant est BX lr.
3
13. Quelles sont les instructions utilisées pour exécuter la comparaison dans la boucle? Expliquer
leurs fonctionnements ?
MOVS r0, #0 ; le registre r0 est initialisé à 0.
ADDS r0, r0,#1 ; r0=r0+1 .
CMP r0, #0Xa ; comparer la valeur de i à la valeur de nombre d’éléments du tableau qui est
égal à 10 (= 0xa en hexadécimal)
BCC |L1.52| ; si la valeur de i est inférieure à 10 alors on reprend la boucle sinon on sort de la
boucle.
14. Examiner la table des symboles (Global Symbols) puis compléter le tableau suivant :
Main 0x080009e5 34
list_init 0x0800099d 44
list_find 0x080009c9 28
List 0x20000048 40
Offset 0x2000001c 40
16. Examiner la section (Image component sizes) puis remplir le tableau suivant pour le fichier
main.o :
4
17. Examiner la table des symboles (Global Symbol) puis compléter le tableau suivant, Identifier
les changements par rapport au tableau de la question 14 et expliquer leurs causes :
Main 0x080009e5 34
list_init 0x0800099d 44
list_find 0x080009c9 28
List 0x20000020 40
Offset 0x08000ba0 40
Les changements remarqués dans le fichier main_const_list.txt est le fait d’avoir AREA ||.
constdata ||, au lieu d’avoir AREA || .data ||.
19. Copier les valeurs observées dans la question 16 dans la première ligne du tableau, puis
examiner de nouveau la section (Image component sizes) et remplir les valeurs dans la
deuxième ligne, quel sont les changements observés, donner une explication par rapport à ces
changements ?