TP 2
TP 2
TP 2
A) Manipulation
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
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\.
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
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.
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 :
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 ?
Q7) Si on veut changer le nombre de boucles exécutées, quelle ligne du programme faut-il
modifier ?
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 ?
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.
int main()
{
int n;
char a,b;
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).
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.
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 ?