17
Microcontroleurs I Accès Mémoire, Branchement Conditionnels, Boucles Pierre Corbineau IESE3 S5 2020–2021

Microcontroleurs I - Accès Mémoire, Branchement Conditionnels, Boucles … · 2021. 1. 22. · source:.string "Abracadabra!" dest:.space 20 Microcontroleurs I — P. Corbineau Cours

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

  • 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** * **