Microcontroleurs I - Accès Mémoire, Branchement Conditionnels, Boucles … · 2021. 1. 22. ·...
Transcript of Microcontroleurs I - Accès Mémoire, Branchement Conditionnels, Boucles … · 2021. 1. 22. ·...
-
Microcontroleurs I
Accès Mémoire, Branchement Conditionnels,Boucles
Pierre Corbineau
IESE3 S5
2020–2021
-
Données Accès mémoire Branchements Exemples
Le codage ASCII
American Standard for Code Information Interchange.I Codage des caractères sous forme de nombres 8-bitsI La notation ’c’ désigne le code de c (0x63) .
x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF0x NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI1x DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US2x ! " # $ % & ’ ( ) * + , - . /3x 0 1 2 3 4 5 6 7 8 9 : ; < = > ?4x @ A B C D E F G H I J K L M N O5x P Q R S T U V W X Y Z [ \ ] ~ _6x ‘ a b c d e f g h i j k l m n o7x p q r s t u v w x y z { | } ˜
Propriétés utiles :I ’0’ + n = ’n’ pour tout chiffre n (’0’ = 0x30 = 48)I ’a’ + (i - 1) = ’’I ’a’ - ’A’ = ’b’ - ’B’ = . . .= ’z’ - ’Z’ = 0x20 = 32
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Rappel : placement et alignementDonnée codée sur 2 octets :I Contrainte d’alignement : adresse adr multiple de 2I Placement little endian : [adr,2] = [adr+1]:[adr]I Exemple : [adr,2] = 0xdeaf
m[adr] = 0xaf et [adr+1] = 0xde
Donnée codée sur 4 octetsI Contrainte d’alignement : adresse adr multiple de 4I little endian : [adr,4] = [adr+3]:[adr+2]:[adr+1]:[adr]
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Sections .data et .rodata
Les sections de la mémoire d’un programme :I La section mémoire .text contient le code exécutable
(instructions)I En mémoire Flash
I La section mémoire .rodata (read-only data) contient lesdonnées constantes globales utilisées dans un programme(en mémoire Flash)I En mémoire Flash
I La section mémoire .data contient les variables globalesdu programmeI En mémoire RAMI Valeur initiales en mémoire FlashI À l’amorçage, on copie les valeurs initiales dans la RAM.
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Placement de données en section .data
.data /∗ Ajout dans la section .data ∗/tab1: .byte 12,-3,150,0xbb,’c’ /∗ octets sous forme numérique ∗/tab2: .ascii "abc" /∗ équiv. à .byte ’a’,’b’,’c’ ∗/
.asciz "BOF" /∗ équiv. à .byte ’B’,’O’,’F’,0 ∗/
.string "Bonjour" /∗ idem .asciz ∗/
.align 1 /∗ octets nuls jusqu’à adresse 21-alignée ∗/tab3: .hword 0xf0e5,-10000,32564 /∗ demi-mots (!! little-endian) ∗/
.short 0xdeaf /∗ même chose ∗/
.align 2 /∗ octets nuls jusqu’à adresse 22-alignée ∗/tabs: .word 0x08080000 /∗ mots (!! little-endian) ∗/
.long tab1,tab2 /∗ adresses d’autres données (pointeurs) ∗/
.int -3,2000000,(1
-
Données Accès mémoire Branchements Exemples
Instruction STR : écrire en mémoireSyntaxe : str rt,[rn,offset] /*STore Register */I offset (décalage d’adresse) :
I registre (, lsl #0-3) ou #constante
Effet : rt → [rn+offset,4]I rt[0:7] → [rn+offset]I rt[8:15] → [rn+offset+1]I rt[16:23] → [rn+offset+2]I rt[24:31] → [rn+offset+3]
Variantes :I strh (store halfword) : rt[0:15] → [rn+offset,2]
I rt[0:7] → [rn+offset]I rt[8:15] → [rn+offset+1]
I strb (store byte) : rt[0:7] → [rn+offset,1]I rt[0:7] → [rn+offset]
On parle d’adressage indexé sur le registre rn.Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Instruction LDR : lire en mémoire
Lecture en mémoire : ldr rt,[rn,offset] /*LoaD Register */Effet : rt ← [rn+offset,4]Variantes :I ldrh (load halfword)
I rt[0:15] ← [rn+offset,2], rt[16:31] ← 0I ldrsh (load signed halfword)
I rt[0:15] ← [rn+offset,2]rt[16:31] ← 0x0000 ou 0xffff selon signe
I Extension du bit de signe aux 2 octets de poids fortI ldrb (load byte)
I rt[0:7] ← [rn+offset,1], rt[8:31] ← 0I ldrsb (load signed byte)
I rt[0:7] ← [rn+offset,1]rt[8:31] ← 0x000000 ou 0xffffff selon signe
I Extension du bit de signe aux 3 octets de poids fort
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Exemple : accès dans un tableauTableau : données de même taille stockées contigüment
adressed’un élément
=adresse
du tableau+
(indice
de l’élément× taille
d’un élément
).data
alpha: .string "abgdefch"bignum: .word 7, 8, 9, 42, 11, 12, 13
.textdo_alpha:
ldr r0,=alpha /∗ adresse de base du tableau alpha ∗/ldrb r1,[r0,#2] /∗ on lit le ’g’ ∗/ldrb r2,[r0,#6] /∗ on lit le ’c’ ∗/strb r1,[r0,#6] /∗ on écrit le ’c’ à sa place ∗/strb r2,[r0,#2] /∗ on écrit le ’g’ à sa place ∗/
do_bignum:ldr r0,=bignum /∗ adresse de base du tableau bignum ∗/mov r1,#10 /∗ valeur à écrire ∗/mov r2,#3 /∗ position (indice) où écrire ∗/str r1,[r0,r2,lsl #2] /∗ !! offset = r2 × 4 (mots 32-bits) ∗/
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Chargement immédiat, pre-/post-indexationI ldr rt,=constante : plus commode que movw,movt
I Effet : rt ← constante (chargement immédiat)I En général : codage pc-relatif
I placement dans un pool de constantes (section .text)
ldr r0,[pc,#0x20] /∗ dans le fichier source: ldr r0,=0xdeadbeef ∗/... /∗ instructions suivantes ∗/pop {pc} /∗ fin de la procédure ∗/... /∗ début du pool de constantes immédiates ∗/.word 0xdeadbeef /∗ constante placée dans .text par l’assembleur ∗/
/∗ offset = 0x20 octets calculé par l’assembleur ∗/
I Pour simplifier la programmation de boucles et les parcours detableaux, on peut combiner accès à la mémoire et modificationdu registre d’index :
ldr r2,[r0],#4 /∗ lecture à l’adresse r0 puis r0← r0+4 ∗//∗ après l’instruction r0 pointe sur le mot suivant ∗/
strb r3,[r0],#1 /∗ écriture à l’adresse r0 puis r0← r0+1 ∗//∗ après l’instruction r0 pointe sur l’octet suivant ∗/
ldr r1,[r0,#4]! /∗ lecture à r0+4; l’adresse r0+4 est stockée dans r0 ∗/
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Branchements : principe
Branchement = rupture programmée de la séquenced’exécutionI technique : modification explicite de pcI destination du branchement : étiquette dans le programme
Il existe 3 sortes de branchements :I inconditionnel : le branchement est effectué à chaque
passageI b : Branch to
I conditionnel : le branchement est conditionné auxindicateurs NZCVI b{cond} : Branch to if {cond}
I avec lien : une adresse de retour de branchement eststockée dans lrI bl : Branch with Link to I Retour de procédure avec mov pc,lr
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Branchemt conditionnel après cmp non-signé
En combinaison avec cmp, on peut conditionner unbranchement à la comparaison d’un registre avec un autreopérande constante ou registre.
cmp rn,op2b{cond}
Si on compare des nombres non-signés, on pourra utiliser lesbranchements conditionnels suivants :
mnémonique PSR signification effetbeq Z=1 Branch if EQual saut si rn=op2bne Z=0 Branch if Not Equal saut si rn6=op2blobcc C=0
Branch if LOwerBranch if Carry Clear saut si rnop2
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Branchemt conditionnel après cmp signé
Si on compare des nombres signés, on va exploiter lesindicateurs NZCV différemment avec de nouvelles instructions :
mnémonique PSR signification effetbeq Z=1 Branch if EQual saut si rn=op2bne Z=0 Branch if Not Equal saut si rn6=op2blt N6=V Branch if Less Than saut si rnop2
Après d’autres instructions modifiant le PSR, on peut aussiutiliser les tests suivants :
mnémonique PSR signification effetbmi N=1 Branch if MInus saut si MSB=1bpl N=0 Branch if PLus saut si MSB=0bvs V=1 Branch if oVerflow Set saut si dépassemt signébvc V=0 Branch if oVerflow Clear saut si pas de dépassetsigné
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Instructions combinées, test de bitsLes instructions cbz et cbnz combinent :I comparaison d’un registre à 0 (PSR inchangé)I saut si registre =0 (cbz) ou 6=0 (cbnz).
cbz r0,branche1 /∗ saut à branche1 si r0=0 ∗/cbnz r1,branche2 /∗ saut à branche2 si r16=0 ∗/
En combinaison avec tst, on peut conditionner unbranchement à la valeur d’un bit sélectionné dans un registre.
tst rn,#(1
-
Données Accès mémoire Branchements Exemples
Valeur absolue
mov r0,#-46/∗ entrée : r0 = N signé ∗/
cmp r0,#0bge finrsb r0,r0,#0
fin:/∗ sortie : r0 = |N| ∗/
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Factorielle
Rappel : n! = 1× 2× · · · × n
mov r0,#7/∗ entrée : r0 = N non-signé ∗/
mov r1,#1mov r2,#1
boucle:mul r2,r2,r1cmp r1,r0bhs finadd r1,r1,#1b boucle
fin:mov r0,r2
/∗ sortie : r0 = N! non-signé ∗/
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Longueur d’une chaîne de caractèresLongueur : nombre de carac-tères avant le caractère nulfinal
ldr r0,=hello/∗ entrée r0 = adresse chaîne ∗/
mov r1,#0
boucle:ldrb r2,[r0,r1]cmp r2,#0beq finadd r1,r1,#1b boucle
fin:mov r0,r1
/∗ sortie r0 = longueur ∗/.data
hello:.string "Hello!"
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
-
Données Accès mémoire Branchements Exemples
Copie d’une chaîne de caractères
ldr r0,=destldr r1,=source
/∗ entrée r0 = adresse destination ∗//∗ entrée r1 = adresse source ∗/
boucle:ldrb r2,[r1],#1strb r2,[r0],#1cbz r2,finboucleb boucle
finboucle:/∗ pas de résultat : effets de bord ∗/
.datasource: .string "Abracadabra!"dest: .space 20
Microcontroleurs I — P. Corbineau Cours 2 IESE3 S5 — 2020–2021
Gestion des données** * **
Accès mémoire** * **
Branchements (in)conditionnels** * **
Exemples de programmes** * **