Langage d'assemblage et chaîne d'outils - IESE3 S5 Pierre Corbineau 2022-2023 Microcontroleurs I - Langage d'assemblage et chaîne ...

La page est créée Jacques Vallet
 
CONTINUER À LIRE
Langage d'assemblage et chaîne d'outils - IESE3 S5 Pierre Corbineau 2022-2023 Microcontroleurs I - Langage d'assemblage et chaîne ...
Microcontroleurs I

Langage d’assemblage et chaîne d’outils

            Pierre Corbineau

                IESE3 S5

               2022–2023
Architecture                         Le langage d’assemblage         La chaîne d’outils

   Architecture du micro-processeur

Microcontroleurs I   —   P. Corbineau             Cours 1         IESE3 S5   —   2022–2023
Architecture                         Le langage d’assemblage             La chaîne d’outils

   Les registres du processeur ARM
          Registre : mot mémoire interne au microprocesseur
          Registres généraux r0-r15 (32-bits)
           I r0-r12 : stockage des opérandes d’instructions
           I r13 (SP) : adresse du sommet de la pile
                     I Zone de la RAM pour stockage temporaire
             I r14 (LR) : adresse de retour des procédures
                     I Gestion du retour au programme appelant
             I r15 (PC) : adresse de l’instruction courante + LSB=1
                     I Avance de 2 unités à chaque instruction 16-bits
                     I Avance de 4 unités à chaque instruction 2×16-bits
          Registre spécial PSR = Program Status Register

Microcontroleurs I   —   P. Corbineau             Cours 1             IESE3 S5   —   2022–2023
Architecture                            Le langage d’assemblage               La chaîne d’outils

   Stockage en mémoire
          À chaque adresse 0x0000 0000–0xffff ffff correspond un octet
          en mémoire.
           I Donnée codée sur 1 octet
                     I Occupe en mémoire 1 octet : notation [adr] ou [adr,1]
             I Donnée codée sur 2 octets
                     I Occupe en mémoire 2 octets : notation [adr,2]
                     I Placement little endian : [adr,2] = [adr+1]:[adr]
             I Donnée codée sur 4 octets
                     I Occupe en mémoire 4 octets : notation [adr,4]
                     I little endian : [adr,4] = [adr+3]:[adr+2]:[adr+1]:[adr]
             I Instruction codée 1 ou 2 demi-mots
                     I Contrainte d’alignement : adresse multiple de 2
                     I Occupe en mémoire 2 ou 4 octets
                     I Placement little endian par demi-mot :
                              I code instruction = [pc+1]:[pc] ou
                              I code instruction = [pc+1]:[pc]:[pc+3]:[pc+2]

Microcontroleurs I   —   P. Corbineau                Cours 1               IESE3 S5   —   2022–2023
Architecture                                    Le langage d’assemblage                           La chaîne d’outils

   Organisation de la mémoire

                                        Plan mémoire du STM32F446RE
             Adresses                     Taille       Nom           Type de    Contenu
             début – fin                                             mémoire
             0x0000 0000 -               512kiB        Flash         non-       – amorçage (boot)
             0x0007 ffff                                             volatile   – programme (instructions)
                                                                                – données non-mutables
                                                                                – valeurs initiales des don-
                                                                                nées mutables
             0x2000 0000 -               128kiB        RAM           volatile   – données mutables
             0x2001 ffff
             0x4000 0000 -              dispersée      Périph.       spéciale   – configuration
             0x5fff ffff                               STM32                    – communication
             0xe000 0000 -              dispersée      Périph.       spéciale   – configuration
             0xe001 ffff                               ARM                      – communication

Microcontroleurs I   —   P. Corbineau                          Cours 1                         IESE3 S5   —    2022–2023
Architecture                         Le langage d’assemblage             La chaîne d’outils

   Amorçage et exécution séquentielle
          Amorçage et initialisation des registres au reset :
           I sp ← [0x0000 0000,4]
             I lr ← 0xffff ffff
             I pc ← [0x0000 0004,4] (LSB à 1 obligatoire)
             I r0-r12 ← ????
          Exécution du programme :
           I Lecture en mémoire de l’instruction
                     I [pc+1]:[pc] ou [pc+1]:[pc]:[pc+3]:[pc+2]
             I Exécution de l’instruction
                     I lecture/écriture de registres + indicateurs
                     I transferts mémoire ↔ registres
             I pc ← pc+2 ou pc+4
                     I certaines instructions peuvent modifier pc (branchement)
             I Fin du cycle : on passe à l’instruction suivante
Microcontroleurs I   —   P. Corbineau             Cours 1             IESE3 S5   —   2022–2023
Architecture                               Le langage d’assemblage                        La chaîne d’outils

   Programmer en langage d’assemblage
                         .syntax unified /∗ Commence par "." = directive d’assemblage ∗/
                         .text              /∗ section .text car on écrit des instructions ∗/
                         .globl main        /∗ "main" est visible globalement ∗/
                         .thumb_func        /∗ "main" utilise les instructions Thumb ∗/
           main:                     /∗ étiquette "main" = adresse de la première instruction ∗/
                                     /∗ étiquette = commence au début de la ligne, finit par ":" ∗/
                          push {lr}         /∗ instruction: toujours après une tabulation ∗/

           /∗ Insert program here ∗/       /∗ ← ceci est un commentaire ∗/

                          mov r1,#2    /∗ r1←2; mnémonique "mov" ∗/
                                       /∗ opérandes: registre r1, constante (décimale) 2 ∗/
                          mov r2,r1    /∗ r2←r1; mnémonique "mov" ∗/
                                       /∗ opérandes: registre r2, registre r1 ∗/
                          add r3,r1,r2 /∗ r3←r1+r2; mnémonique "add" ∗/
                                       /∗ opérandes: registre r3, registre r1, registre r2 ∗/
                          cmp r3,#4    /∗ comparer r3 et 4; mnémonique cmp ∗/
                                       /∗ opérandes: registre r3, constante (décimale) 4 ∗/

           /∗ return 0; ∗/
                      mov r0,#0
                      pop {pc} /∗ fin de "main" ∗/

Microcontroleurs I   —   P. Corbineau                   Cours 1                        IESE3 S5   —   2022–2023
Architecture                          Le langage d’assemblage             La chaîne d’outils

   Charger des constantes
          En raison du codage des instructions sur 16 ou 32 bits, il n’est
          pas possible de charger toutes les constantes possibles avec
          une seule instruction.
          Différents cas pour rn ← #k
           I 0 ≤ k ≤ 255 : mov rn,#k
                     I rn ← #0x0000 00kk
             I −256 ≤ k ≤ −1 : mvn rn,#j, avec j = −(k + 1)
                     I rn ← complément à 1 de #0x0000 00jj
             I 0 ≤ k ≤ 65535 : movw rn,#k
                     I rn ← #0x0000 kkkk
             I autre cas : 2 instructions nécessaires
                     I movw rn,#klow /* demi−mot de poids faible */
                     I movt rn,#khigh /* demi−mot de poids fort */
                              I rn[16:31] ← #0xkkkk avec rn[0:15] inchangé

          Cette liste n’est pas exhaustive. . .
Microcontroleurs I   —   P. Corbineau              Cours 1            IESE3 S5   —    2022–2023
Architecture                         Le langage d’assemblage             La chaîne d’outils

   Principe du code 3 registres

          Les instructions de calcul utilisent le format  rd,rn,op2
           I  est le mnémonique de l’opération à effectuer (add,
              mul, and. . .)
           I rd désigne le registre destination du résultat de l’opération
             I rn désigne le registre contenant le premier opérande
             I op2 désigne le second opérande
                     I Soit une constante immédiate #k (ex : #0x3f)
                     I Soit un registre rm
          Exemples :
           I mul r1,r2,r3 /* r1 ← r2 * r3 */
           I and r0,r0,#0x3f /* r0 ← r0 & 0x3f */
          Restrictions sur les constantes possibles (cf mov).

Microcontroleurs I   —   P. Corbineau             Cours 1             IESE3 S5   —   2022–2023
Architecture                              Le langage d’assemblage                          La chaîne d’outils

   Instructions de calcul
        Mnémonique           Description                               Signification
           mov               transfert/chargement                      rd ← Op2 (pas de rn)
           mvn               complément à 1                            rd ← (˜ Op2) (pas de rn)
           and               ET logique bit à bit                      rd ← rn & Op2
           bic               BIt Clear (ET NON)                        rd ← rn & (˜ Op2)
           orr               OU logique bit à bit                      rd ← rn | Op2
           orn               OR Not (OU NON)                           rd ← rn | (˜ Op2)
           eor               Exclusive OR (Ou exclusif)                rd ← rn ˆ Op2
           add               Somme (modulo 232 )                       rd ← (rn + Op2) mod 232
           adc               Somme avec retenue (Carry)                rd ← (rn + Op2 + C) mod 232
           sbc               Soustraction avec retenue                 rd ← (rn – Op2 – (1 – C)) mod 232
           sub               Soustraction (modulo 232 )                rd ← (rn – Op2) mod 232
           rsb               Soustraction inversée                     rd ← (Op2 – rn) mod 232
           mul               Multiplication (modulo 232 )              rd ← (rn × rm) mod 232
           udiv              Division entière non-signée               rd ← (rn / rm) non-signée
           sdiv              Division entière signée                   rd ← (rn / rm) signée
           lsl               Décalage logique à gauche (k=1..31)       rd ← (rn > Op2) logique
           asr               Décalage arithm. à droite (k=1..32)       rd ← (rn >> Op2) arith.
           ror               Rotation à droite (k=1..31)               rd ← rotation (rn,Op2)

Microcontroleurs I   —   P. Corbineau                  Cours 1                          IESE3 S5   —   2022–2023
Architecture                         Le langage d’assemblage         La chaîne d’outils

   Instructions et indicateurs d’état NZCV
          Les indicateurs d’état NZCV = PSR[28 :31] sont positionnés
          après certaines instructions :
           I la comparaison cmp rn,op2 calcule (rn - op2) et
              positionne NZVC
           I le test tst rn,op2 calcule rn&op2 et positionne NZ
           I les instructions de calcul avec suffixe "s" : adds, ands . . .
           I N=Negative indique le signe du résultat (MSB du résultat)
           I Z=Zero vaut 1 si le resultat est 0 (exemple : cmp r2,r2)
           I C=Carry vaut 1 si le calcul a produit une retenue
           I V=oVerflow vaut 1 si le calcul a produit un débordement
              signé
          On peut accéder directement à PSR grâce aux instructions
          suivantes :
           I mrs rn,psr /* rn←psr */
           I msr apsr_nzcv,rn /* psr[28:31]←rn[28:31]*/
Microcontroleurs I   —   P. Corbineau             Cours 1         IESE3 S5   —   2022–2023
Architecture                                 Le langage d’assemblage               La chaîne d’outils

   Organisation d’un calcul complexe

          On souhaite calculer (A + B)(A − B).
           I entrées : A=32 et B=0xbea34562
                     mov r0,#32               /∗ r0
Architecture                         Le langage d’assemblage                  La chaîne d’outils

   Décodage des instructions : un exemple
          On lit les octets suivants dans la mémoire :
           I 13 f1 2d 07
          Le code de l’instruction est donc : (little endian)
           I f113 072d en hexadécimal
           I 11110001 00010011 00000111 00101101 en binaire
          On reconnait (cf fiche technique) le codage 32-bits d’une
          opération arithmétique ou logique (opérande constante) :
           I 1111000o ooosnnnn 0000dddd xxxxxxxx en binaire
           I Décodage du mnémonique : oooo = (1000)2 et s=1 : adds
           I Décodage de la destination : registre dddd = (0111)2 : r7
           I Décodage de l’opérande 1 : registre nnnn = (0011)2 : r3
           I Opérande 2 (constante) : xxxxxxxx = (00101101)2 = 45
           I Instruction décodée : adds.w r7,r3,#45
                     I Le suffixe ".w" précise que l’instruction est codée sur
                       2×16-bits
Microcontroleurs I   —   P. Corbineau             Cours 1                IESE3 S5   —     2022–2023
Architecture                         Le langage d’assemblage            La chaîne d’outils

   Le répertoire de projet
          Structure des répertoires :
           I À la racine du projet :
                     I Makefile (générique, ne pas modifier)
                     I Makefile.project (modifier pour ajouter des
                       sources. . .)
             I src : contient les fichiers source C ou assembleur
                     I main.S : fichier source principal
             I obj : fichiers objet .o (intermédiaires de compilation)
             I bin : fichier executable .elf (programme compilé)
             I devtools : scripts de développement
                     I stm32-load : pour charger et lancer un programme sur le
                       STM32
                     I stm32-debug : pour lancer une session de debug
             I link : description du placement en mémoire des sections
                     I Adresses de base de RAM, Flash et périphériques
Microcontroleurs I   —   P. Corbineau             Cours 1            IESE3 S5   —   2022–2023
Architecture                         Le langage d’assemblage             La chaîne d’outils

   La chaîne de compilation

          Pour compiler puis exécuter un programme assembleur, il faut
          effectuer plusieurs étapes successives :
            I L’assembleur transforme le langage d’assemblage .S en
               codage binaire .o
            I L’éditeur de liens rassemble le code binaire de plusieurs
               fichiers objet pour créer le programme .elf
                     I résolution des références externes dans chaque fichier
             I Le logiciel openocd envoie le code binaire du programme
               complet à la sonde STLink
                     I Port USB, moitié haute de la carte Nucleo
             I La sonde STLink utilise le TAP (Test Access Port, aussi
               appelé interface JTAG) du STM32 pour écrire le
               programme dans la mémoire Flash.
          Commande : make load

Microcontroleurs I   —   P. Corbineau             Cours 1             IESE3 S5   —   2022–2023
Architecture                            Le langage d’assemblage                       La chaîne d’outils

   Les commandes utiles du débuggeur GDB
          Pour lancer une session GDB : make debug

              I disas /r main (disassemble) afficher les instructions de la procédure main
                (/r = afficher le codage hexa des instructions)
              I x $pc (examine) afficher la prochaine instruction
              I x /3xh $pc afficher 3 demi-mots (h) en hexadécimal (x) à partir de pc
              I x /x {$r0,$r1,$r2} afficher r0,r1,r2 en hexa
              I display /x $r0,$r1,$r2 afficher r0,r1,r2 à chaque arrêt du programme
              I undisplay [n] annuler un ou tous les display
              I start reset et exécution jusqu’au début de main
              I br *main (breakpoint) point d’arrêt au début de main
              I br *main+12 poser un point d’arrêt sur l’instruction à l’adresse main+12
              I delete [n] supprimer un point d’arrêt ou tous les points d’arrêt
              I s (step) avancer d’une instruction
              I n (next) avancer d’une instruction en sautant les appels de procédure
              I cont (continue) reprendre l’exécution continue jusqu’au prochain point d’arrêt

                                        Et maintenant : démonstration !

Microcontroleurs I   —   P. Corbineau                Cours 1                       IESE3 S5   —   2022–2023
Vous pouvez aussi lire