Architecture des systèmes à base de microprocesseur IN3R12, 2013/2014 Accès aux données et opérations arithmétiques TP1 (4h) Objectifs du TP : Apprendre à écrire un programme en langage assembleur et le traduire en code machine exécutable par un microprocesseur ; Exécuter le programme à l’aide d’un simulateur de ARM Cortex M3 (logiciel µVision de Keil) ; Apprendre à observer, analyser et comprendre les résultats obtenus après l’exécution des différentes instructions (contenus des registres internes (R0-R12, PC, xPSR), et de la mémoire. Remarques sur la méthode de travail : Notez vos observations afin de pouvoir vous en servir pour la révision ; Avant d’exécuter une instruction, évaluez le résultat attendu « à la main » pour vérifier le résultat obtenu pas la suite. … continuez sur la page suivante Partie 1 : Prise en main de l’environnement de développement µVision Vous commencerez par créer un projet, selon les instructions dans le tutoriel fourni. Voici un programme simple qui vous permet de découvrir la structure d’un programme en langage assembleur, l’exécuter et apprendre à utiliser les différentes informations du simulateur (contenu des registres, de la mémoire, le PC, xPSR, …) Créez le nouveau fichier <nom_programme>.s (remplacez le <nom_programme> par un nom de fichier de votre choix>), recopiez cet exemple et ajouter le au projet. Assembler le projet, selon les instructions dans le tutoriel. ;; Premier programme pour la prise en main du simulateur ;; Respectez l’alignement des différentes parties AREA TP1, CODE, READONLY ; AREA – indique une nouvelle section de programme, obligatoire en assembleur ARM ; CODE – il s’agit de la partie du programme contenant des instructions ; READONLY – ce programme sera mis dans la mémoire ROM X EQU 255 Y EQU -128 Z EQU 25800 ENTRY ; ENTRY – indique le début du programme EXPORT __main ; EXPORT – indique que fonction __main sera utilisée dans un autre fichier __main ; __main étiquette représentant le nom de cette partie du programme (fonction) ; charger X,Y,Z dans des différents registres MOV r1,#X MOV r2,#Y LDR r3,=X LDR r4,=Z ; faire quelques opérations arithmétiques ADDS r1,r2 ADDS r3, r4 ; fin de programme NOP END QUESTION 1 : Après avoir assemblé le programme mais avant son exécution, regardez dans le dossier du travail et ouvrez le fichier <nom_programme>.lst. Quelle est la taille du programme dans l’exemple utilisé ? Vérifiez le résultat obtenu à l’aide du fichier <nom_projet>.map. QUESTION 2 : Toujours avec le fichier <nom_projet>.map , à quelle adresse sera placée la première instruction du programme de notre exemple ? QUESTION 3 : Selon les indications dans le tutoriel, lancez l’exécution du programme en mode pas à pas et observez les contenus des registres R0-R12, xPSR, PC (R15) Quelle est l’adresse de la première instruction de la fonction __main (réponse de la précédente question) Quelle est la valeur du PC avant exécuter cette première instruction ? Quelle est la valeur du PC après son exécution et à quoi cela correspond ? Quel est l’état des indicateurs N,Z,X,C après l’instruction ADDS r1,r2 ? Partie 2 : Exercices – Opérations arithmétiques et logiques Opérations arithmétiques et logiques : donner pour chacune des opérations ci-dessous, l’instruction en langage assembleur ARM Cortex – M3. On traitera le cas des données codées 32 bits. Pour ces exercices, les registres seront initialisés à l’aide des constantes définies avec la directive EQU. Les résultats sont rangés dans un registre. Donner pour chacune de ces opérations le résultat attendu, ainsi que l’état des indicateurs N, Z, V et C positionnés à 1. Vérifier à l’aide du simulateur µVISION4que le résultat observé correspond à celui attendu. 254 + 1 (-3) + (-127) 28+30 0x80000000 + 0x80000000 0xFFFFFFFF ET 0x0000FFFF 0xFFFF0000 OU 0x0000FFFF Partie 3 : Exercices – Accès aux données En partant de l’exemple suivant, complétez-le pour réaliser les exercices ci-dessous. Pour chaque opération, donner le contenu de registre modifié ou de la mémoire modifiée. On suppose que le contenu de la mémoire en octet à partir de l’adresse indiquée par l’étiquette TAB est le suivant : 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0x01, 0x02,0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09. Chaque exercice sera réalisé a) avec un mode d’adressage indirect et b) mode d’adressage indirecte avec décalage. lire le 8ème élément de cette zone lui ajouter la valeur 5 et le ranger dans le registre R3 lire le 2ème et le 3ème élément à partir de l’élément de valeur 0x88, les additionner et ranger le résultat dans le 1er élément de la zone d’adresse indiquée par l’étiquette R lire 4 octets consécutifs à partir du 11ème élément, faire un décalage à gauche de deux positions, ranger le résultat à l’adresse de R. ;; Programme pour réaliser les exercices TP1 AREA TP1P3, CODE, READONLY ; définir les constantes avec EQU ci-dessous X EQU 5 ENTRY EXPORT __main __main ; quelques exemples d’accès aux données et obtention des adresses des tableaux LDR LDR LDRB LDR R0,=X ; on initialise le R0 avec la valeur de X, équivalent à MOV R0,#X R1,=TAB ; on récupère l’adresse du premier élément de tableau TAB R2,[R1] ; on récupère la valeur du premier élément R3,=R ; on récupère l’adresse de R ; mettre les instructions pour réaliser les exercices NOP ; Section DATA pour initialiser le contenu de la mémoire AREA TP1d, DATA, READONLY TAB DCB 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0x01,0x02,0x03 R AREA TP1dw, DATA,READWRITE SPACE 4 END