Langage d'assemblage et chaîne d'outils - IESE3 S5 Pierre Corbineau 2022-2023 Microcontroleurs I - Langage d'assemblage et chaîne ...
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
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