Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% ont trouvé ce document utile (0 vote)
21 vues7 pages

TP 2

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1/ 7

ARM – TP2

Lors de ce TP vous devez :


comprendre la différence entre le processeur et la mémoire au travers des instructions load et
store (LDR et STR).
Comprendre la programmation des boucles
Comprendre le travail d’un compilateur C

A) Manipulation

Replacez-vous sous votre répertoire de travail

D:\TP_A1

Puis aller sur le répertoire de votre nom de binôme s’il existe. Vous devez le créer si ce n’est pas le cas.

D:\TP_A1\Votre_Nom

Sous ce répertoire, créer deux répertoires Lab2_Asm et Lab2_C:

D:\TP_A1\Votre_Nom\Lab2_C\
D:\TP_A1\Votre_Nom\Lab2_Asm\

Si vous souhaitez copier votre travail sur une clé de sauvegarde, vous devez copier tout votre
répertoire \TP_A1\Votre_Nom\.

PARTIE 1 (langage Assembleur)


Lancer l’environnement de développement en cliquant sur l’icône :

Faire : Project -> create New Project


Puis créer un projet de type asm :

Enregistrer sous : D:\TP_A1\Votre_Nom\Lab2_Asm\. Vous pouvez utiliser TP2Asm comme

nom de projet.

Sauvegarder l’environnement en cliquant sur l’icône, et sauvegarder sous le même nom TP2Asm.

Dans le fichier "asm.s79", remplacer tout le code existant par le code suivant :
(Vous pouvez copier à partir du fichier Tp2_Asm.txt de Moodle)

CODE32

NBRE equ 10

main
Ldr R10, =Table
Mov R2, #NBRE
bcle Ldrb R0, [R10]
Mov R1, R0, LSL #1
Add R10, R10, #1
Subs R2, R2, #1
Bne bcle
Ici Nop
B Ici

Table DC8 0x31,0x42,0x33,0x44,0x36,0x46,0x39,0x48,0x3C,0x4A

END main
Assemblez le programme avec le menu :
Project → make (raccourci : F7)

Ce programme doit s’assembler sans erreur. Vérifier les indentations sur les lignes qui seraient
invalides. (Les étiquettes de programmes doivent se trouver en première colonne).
Lancer le debugger : Project → Debug (raccourci : ^D)
Votre programme est alors placé dans la mémoire.
Vous devez identifier l’adresse mémoire contenant les instructions et les données (codes
instructions) qui s’y trouvent dans la fenêtre "Disassembly" au milieu.

Dans le programme source, il y a des lignes qui ne génèrent pas d’instructions du processeur.
Il y a aussi des lignes qui génèrent des données mais pas d’instructions.

Q1) Quelle est l’adresse de début de votre programme ?


Combien d’instructions au total comporte ce programme ?

Q2) Quelle est le code binaire (exprimée en hexadécimal) de l’instruction : MOV R10, #0x24

Q3) Quelle est l’adresse (exprimée en hexadécimal) de l’instruction : MOV R2, #0x0A

Q4) Combien faut-il d’octets pour coder l’instruction MOV R2, #0x0A

Si votre environnement n’en dispose pas déjà, faites apparaitre les registres et la mémoire avec les menus :

View → Registers et View→Memory

Redimensionner les fenêtres et passer en plein écran de façon à voir à peu près :
Exécuter le programme en pas à pas :
Jusqu’à ce que vous arriviez sur l’ instruction nop.

(Raccourci : F11)

Q5) Quel est le registre qui compte (ou décompte) le nombre de boucles exécutées ?

Q6) Quelle est la signification et le rôle de l’instruction BNE ?

Q7) Si on veut changer le nombre de boucles exécutées, quelle ligne du programme faut-il
modifier ?

Relancer le chargement du programme

Les données [0x31,0x42,0x33 etc…] sont placées en mémoire et référencées par l’étiquette Table.
Repérer ces données dans la fenêtre de visualisation mémoire.

Q8) A partir de quelle adresse repérée par l’étiquette Table les valeurs sont-elles stockées ?

Exécuter le programme en pas à pas.

Q9) Que représentent les valeurs contenues par le registre R10 lors de chaque boucle ?

Q10) Que représentent les valeurs contenues par le registre R0 puis R1 lors de chaque boucle ?
On va maintenant écrire le résultat (de l’opération faite sur chaque élément du tableau) en
mémoire à la place des données de départ.
Pour écrire en mémoire, il faut utiliser l’instruction STRB (store Byte).

Q11) Quelle est la syntaxe de l’instruction STRB ? Quelle instruction faut-il ajouter à votre
programme et à quel endroit ?
Faire la modification et tester pour constater l’écriture des nouvelles valeurs en mémoire
dans la fenêtre "Memory".

PARTIE 2 (langage C)
On va maintenant écrire ce même programme en langage C.

Fermer le projet (File->Close Workspace)

Créer un nouveau projet avec le menu :

Project→create new project →C→main

Sauvegardez le projet sous le nom Tp2C dans le dossier …\Votre_Nom\Lab2_C\.


Dans le fichier "main.c", entrez le code suivant (vous pouvez copier à partir du fichier Tp2_C.txt de
Moodle) :

char Table[] = {0x31,0x42,0x33,0x44,0x36,0x46,0x39,0x48,0x3C,0x4A};


#define NBR 10

int main()
{
int n;
char a,b;

for (n = 0; n < NBR; n++) {


a = Table[n];
b = 2 * a;
Table[n] = b;
}
return 0;
}

Par défaut le système génère un code THUMB (16 bits) il faut configurer le compilateur pour
générer du code ARM (32 bits).

Project → Options… → General Option

Et activer la case Arm :

Sauvegarder l’environnement de votre programme sous le même nom Tp2C :


Compiler le programme.
Lancer le debugger et configurer les fenêtres de façon à visualiser les registres et la mémoire.

Dans la fenêtre Memory, utiliser le Goto 0x… pour visualiser les données du tableau "Table".

Lorsque le curseur est placé dans la fenêtre du programme C, le pas à pas s’exécute instruction C par
instruction C.
Lorsque le curseur est placé dans la fenêtre "Disassembly", le pas à pas s’exécute instruction assembleur
par instruction assembleur.

Exécuter le programme pas à pas.


En suivant l’évolution du programme dans les fenêtres "Disassembly" et "Register" :

Q12) Quels registres sont utilisés pour les variables n, a, b ?

Q13) Combien d’instructions C sont exécutées pour une itération de la bouche for ?
(pas à pas dans la fenêtre du programme C).

Q14) Combien d’instructions assembleur sont exécutées pour une itération de la bouche for ?
(pas à pas dans la fenêtre "Disassembly").

Q15-a) Quel est le nombre total d’instructions assembleur après compilation ? (Compter les
instructions entre les Etiquettes _main et étiquette _exit).
Q15-b) Quel est le rapport entre ce nombre d’instructions et celui trouvé à la question 1 ?
(Nombre d’instructions d’un programme écrit directement en assembleur)
Q15-c) Que pouvez conclure sur le fait d’écrire un programme en C ou en assembleur ?

Vous aimerez peut-être aussi