• Aucun résultat trouvé

Systèmes à Microprocesseurs

N/A
N/A
Protected

Academic year: 2022

Partager "Systèmes à Microprocesseurs"

Copied!
44
0
0

Texte intégral

(1)

Systèmes à Microprocesseurs

Cycle Ingénieur Troisième Année

Sébastien Bilavarn

Cycle Ingénieur Troisième Année

Systèmes à Microprocesseurs

Cycle Ingénieur Troisième Année

- 1 - - 1 -

Sébastien Bilavarn

Cycle Ingénieur Troisième Année

(2)

Ch1 – Représentation de l’information

Ch2 – ARM Instruction Set Architecture

Ch3 – Accès aux données

Ch4 – Programmation structurée

Ch5 – Cycle d’exécution

Ch5 – Cycle d’exécution

Ch6 – Codage binaire

Ch7 – Microcontrôleur ARM Cortex

Plan

Représentation de l’information ARM Instruction Set Architecture Accès aux données

Programmation structurée Cycle d’exécution

- 2 - - 2 -

Cycle d’exécution Codage binaire

Microcontrôleur ARM Cortex-M

(3)

Programmation structurée en

Programmation structurée en assembleur ARM

- 3 - - 3 -

Appels de sous-programmes

Structure de pile

Mise en place d’une pile

Passage de paramètres

(4)

Sous-programme: terme générique désignant un sous programme

Procédure: un sous-programme qui ne renvoie pas de résultat.

Ex: printf ("Hello world\n");

Fonctions: un sous-programme effectuant un traitement sur des données et qui renvoie un résultat.

Ex: c = max (a, b);

Appel et retour de sous-programmes

Un sous-programme doit mémoriser l’adresse du code appelant pour

Un sous-programme doit mémoriser l’adresse du code appelant pour poursuivre l’exécution à l’adresse de retour correspondante

Mécanismes d’échanges de données

Passage de paramètre par valeur: le code appelé dispose d’une copie de la valeur

Passage de paramètre par référence: le code appelé dispose de l’adresse du paramètre. Il peut modifier sa valeur.

Valeur de retour d’une fonction: donnée fournie par le code appelé au code appelant

Notions

programme: terme générique désignant un sous-ensemble d’un

programme qui ne renvoie pas de résultat.

programme effectuant un traitement sur des données

programmes

programme doit mémoriser l’adresse du code appelant pour

- 4 - - 4 -

programme doit mémoriser l’adresse du code appelant pour poursuivre l’exécution à l’adresse de retour correspondante

Mécanismes d’échanges de données

Passage de paramètre par valeur: le code appelé dispose d’une copie de Passage de paramètre par référence: le code appelé dispose de l’adresse du paramètre. Il peut modifier sa valeur.

Valeur de retour d’une fonction: donnée fournie par le code appelé au

(5)

Appel de sous

Appel et retour de sous

Pour appeler un sous programme:

Branch and Link: BL label

L’exécution se poursuit à l’instruction correspondant au label

L’adresse de retour est conservée dans le registre LR (Link Register, r14)

Pour revenir d’un sous-

MOV PC, LR (équivalent à MOV r15, r14)

L’adresse de retour est récupérée dans LR

L’exécution se poursuit à l’instruction qui suit l’instruction d’appel

Appel de sous-programmes

Appel et retour de sous-programmes

Pour appeler un sous programme:

label

L’exécution se poursuit à l’instruction correspondant au label

L’adresse de retour est conservée dans le registre LR (Link Register,

- 5 - - 5 -

-programme:

MOV PC, LR (équivalent à MOV r15, r14) L’adresse de retour est récupérée dans LR

L’exécution se poursuit à l’instruction qui suit l’instruction d’appel

(6)

Enchaînement d’appels

Principe

void main () {

displayMenu();

… }

void displayMenu () { displayStr("1.New");

displayStr("1.New");

displayStr("2.Load");

displayStr("3.Save");

displayStr("4.Quit");

}

void displayStr (char *str) {

}

Enchaînement d’appels

- 6 - - 6 - void displayStr (char *str) {

while (*str){

displayChar(*str);

++str;

}

} void displayChar (char ch) {

… }

(7)

Enchaînement d’appels

Problème de la traduction en assembleur (1)

main:

BL displayMenu

… displayMenu:

BL displayStr

BL displayStr

BL displayStr

BL displayStr MOV PC, LR

Enchaînement d’appels

Problème de la traduction en assembleur (1)

@ retour dans main LR

@ displayMenu PC

Traduction en assembleur:

Branchement temporaire (BL displayMenu)

Dans la fonction main, à l’exécution de l’instruction BL

- 7 - - 7 - Dans la fonction main, à l’exécution de l’instruction BL displayMenu :

-l’adresse de retour (adresse de l’instruction BL

displayMenu + 4) est sauvegardée dans le registre LR (r14)

-puis on saute à l’adresse de la première instruction de displayMenu (PC ← @displayMenu)

(8)

Enchaînement d’appels

Problème de la traduction en assembleur (2)

main:

BL displayMenu

… displayMenu:

BL displayStr

BL displayStr

BL displayStr

BL displayStr MOV PC, LR

Enchaînement d’appels

Problème de la traduction en assembleur (2)

@ retour dans displayMenu LR

@ displayStr PC

Dans la fonction displayMenu, à l’exécution de l’instruction BL displayStr :

-l’adresse de retour (adresse de l’instruction BL

- 8 - - 8 - displayStr:

BL displayChar

MOV PC, LR

-l’adresse de retour (adresse de l’instruction BL

displayMenu + 4) est sauvegardée dans le registre LR (r14)

-puis on saute à l’adresse de la première instruction de displayStr (PC ← @displayStr)

On écrase la valeur

précédente de LR (adresse de retour dans main)!!

(9)

Enchaînement d’appels

Problème de la traduction en assembleur (3)

main:

BL displayMenu

… displayMenu:

BL displayStr

BL displayStr

BL displayStr

BL displayStr MOV PC, LR

Enchaînement d’appels

Problème de la traduction en assembleur (3)

@ retour dans displayStr LR

@ displayChar PC

Dans la fonction displayStr, à l’exécution de l’instruction BL displayChar :

-l’adresse de retour (adresse de l’instruction BL

- 9 - - 9 - displayChar:

MOV PC, LR displayStr:

BL displayChar

MOV PC, LR

-l’adresse de retour (adresse de l’instruction BL displayStr + 4) est sauvegardée dans le registre LR (r14)

-puis on saute à l’adresse de la première instruction de displayChar (PC ← @displayChar)

On écrase la valeur

précédente de LR (adresse de retour dans

displayMenu)!!

(10)

Enchaînement d’appels

Problème de la traduction en assembleur (4)

main:

BL displayMenu

… displayMenu:

BL displayStr

BL displayStr

BL displayStr

BL displayStr MOV PC, LR

Enchaînement d’appels

Problème de la traduction en assembleur (4)

@ retour dans displayStr LR

@ retour dans displayStr PC

A la fin de l’exécution de displayChar :

-on récupère l’adresse de retour dans displayStr, que l’on place dans le registre PC (par l’instruction MOV

- 10 - - 10 - displayStr:

BL displayChar

MOV PC, LR

displayChar:

MOV PC, LR

l’on place dans le registre PC (par l’instruction MOV PC, LR)

-L’exécution reprend à l’adresse de retour dans displayStr

(11)

Enchaînement d’appels

Problème de la traduction en assembleur (5)

main:

BL displayMenu

… displayMenu:

BL displayStr

BL displayStr

BL displayStr

BL displayStr MOV PC, LR

???

???

Enchaînement d’appels

Problème de la traduction en assembleur (5)

@ retour dans displayStr LR

???

PC

A la fin de l’exécution de displayStr :

-on ne peut pas revenir à l’exécution de displayMenu car on a perdu l’adresse de retour (ecrasée

- 11 - - 11 - displayStr:

BL displayChar

MOV PC, LR

displayChar:

MOV PC, LR car on a perdu l’adresse de retour (ecrasée précédemment)

- on ne peut pas non plus revenir à l’exécution de la fonction main

(12)

Enchaînement d’appels

Si un sous-programme est

pas d’autre sous-programme), le registre LR suffit pour sauvegarder et restaurer l’adresse de retour

Ex: fonction displayChar

Si un sous-programme en appelle un autre, la valeur

Si un sous-programme en appelle un autre, la valeur de LR doit être sauvegardée avant d’effectuer le saut à l’instruction BL

Solution: utilisation d’une

La procédure de sauvegarde de l’adresse de retour ne peut fonctionner telle quelle en cas d’enchaînement d’appels à plusieurs sous programmes (cas le plus fréquent)

Enchaînement d’appels

programme est "terminal" (s’il n’appelle programme), le registre LR suffit pour sauvegarder et restaurer l’adresse de retour

displayChar

programme en appelle un autre, la valeur

- 12 - - 12 -

programme en appelle un autre, la valeur de LR doit être sauvegardée avant d’effectuer le saut

Solution: utilisation d’une structure de pile

La procédure de sauvegarde de l’adresse de retour ne peut fonctionner telle quelle en cas d’enchaînement d’appels à plusieurs sous programmes (cas le plus fréquent)

(13)

Principe (1)

main:

BL displayMenu

… displayMenu:

"empiler LR"

… À l’exécution de BL

displayMenu, …

BL displayStr

BL displayStr

BL displayStr

BL displayStr

"dépiler PC"

displayMenu,

l’adresse de retour dans main est

sauvegardée dans le registre LR.

Au début de la fonction

displayMenu, on empile LR (@retour dans main est

sauvegardée dans la pile)

Utilisation d’une pile

@ retour dans main LR

@ displayMenu PC

Pile

- 13 - - 13 -

@ retour dans main Pile

(14)

Principe (2)

main:

BL displayMenu

… displayMenu:

"empiler LR"

… À l’exécution de BL

displayStr, l’adresse …

BL displayStr

BL displayStr

BL displayStr

BL displayStr

"dépiler PC"

displayStr, l’adresse de retour dans

displayMenu est sauvegardée dans le registre LR.

Au début de la fonction displayStr, on empile LR

(@retour dans displayMenu est sauvegardée en mémoire)

Utilisation d’une pile

@ retour dans displayMenu LR

@ displayStr PC

Pile

- 14 - - 14 -

@ retour dans main Pile

displayStr:

"empiler LR"

BL displayChar

"dépiler PC"

@ retour dans displayMenu

(15)

Principe (3)

main:

BL displayMenu

… displayMenu:

"empiler LR"

… BL displayChar: on

saute à l’exécution …

BL displayStr

BL displayStr

BL displayStr

BL displayStr

"dépiler PC"

saute à l’exécution de displayChar

Programme terminal (pas de sous

programme) donc il n’est pas obligatoire d’empiler l’adresse de retour (LR suffit dans ce cas)

Utilisation d’une pile

@ retour dans displayStr LR

@ displayChar PC

Pile

- 15 - - 15 -

@ retour dans main Pile

displayStr:

"empiler LR"

BL displayChar

"dépiler PC"

@ retour dans displayMenu

displayChar:

MOV PC, LR

(16)

Principe (4)

main:

BL displayMenu

… displayMenu:

"empiler LR"

… À la fin de

l’exécution de …

BL displayStr

BL displayStr

BL displayStr

BL displayStr

"dépiler PC"

l’exécution de displayChar, on récupère l’adresse de retour dans

displayStr (contenue dans LR)

Utilisation d’une pile

@ retour dans displayStr LR

@ retour dans displayStr PC

Pile

- 16 - - 16 -

@ retour dans main Pile

displayStr:

"empiler LR"

BL displayChar

"dépiler PC"

@ retour dans displayMenu

displayChar:

MOV PC, LR

(17)

Principe (5)

main:

BL displayMenu

… displayMenu:

"empiler LR"

… À la fin de

l’exécution de …

BL displayStr

BL displayStr

BL displayStr

BL displayStr

"dépiler PC"

l’exécution de displayStr, on récupère l’adresse de retour dans displayMenu (contenue dans la pile): on dépile PC cad on place la dernière donnée empilée (@retour dans displayMenu) dans le registre PC

Utilisation d’une pile

@ retour dans displayStr LR

PC

Pile

@ retour dans displayMenu

- 17 - - 17 - displayChar:

MOV PC, LR

@ retour dans main Pile

displayStr:

"empiler LR"

BL displayChar

"dépiler PC"

(18)

Principe (6)

main:

BL displayMenu

… displayMenu:

"empiler LR"

… À la fin de

BL displayStr

BL displayStr

BL displayStr

BL displayStr

"dépiler PC"

l’exécution de displayMenu, on récupère l’adresse de retour dans main (contenue dans la pile): on dépile PC PC <- @retour dans main

Utilisation d’une pile

@ retour dans displayStr LR

PC

Pile

@ retour dans main

- 18 - - 18 - Pile

displayStr:

"empiler LR"

BL displayChar

"dépiler PC"

displayChar:

MOV PC, LR

(19)

Mise en place d’une pile

La pile réside dans un espace mémoire qui sera réservé spécifiquement à cet usage

Les données sont rangées dans des cellules

adjacentes au fur et à mesure qu’elles sont empilées

Pour repérer le niveau de remplissage de la pile, on utilise un registre pointeur de pile (Stack Pointer SP)

C’est le registre r13 du processeur ARM qui remplit cette fonction

Mise en place d’une pile

La pile réside dans un espace mémoire qui sera réservé spécifiquement à cet usage

Les données sont rangées dans des cellules

adjacentes au fur et à mesure qu’elles sont empilées

- 19 - - 19 -

Pour repérer le niveau de remplissage de la pile, on utilise un registre pointeur de pile (Stack Pointer SP)

C’est le registre r13 du processeur ARM qui remplit cette

(20)

Mise en place d’une pile

Modèles d’évolution de la pile:

Mémoire

La pile se remplit dans le sens des adresses décroissantes Le pointeur de pile SP repère la dernière donnée empilée

Mémoire

SP

Sens des adresses croissantes

Mise en place d’une pile

Modèles d’évolution de la pile: Full Descending

Mémoire

- 20 - - 20 - La pile se remplit dans le sens des adresses décroissantes

Le pointeur de pile SP repère la dernière donnée empilée

Sommet de la pile Mémoire

Base de la pile

Zone mémoire réservée à la

pile

(21)

Mise en place d’une pile

Modèles d’évolution de la pile:

Pour empiler

Mémoire Mémoire

SP

Sens des adresses croissantes

SP ← SP - 4 1

Mise en place d’une pile

Modèles d’évolution de la pile: Full Descending

Mémoire

Empiler:

-On ECRIT après la dernière la donnée pointée dans la pile (à l’adresse SP-4)

- 21 - - 21 -

Mémoire

r1

mem[SP]word← r1 2

-La pile évolue dans le sens des adresses décroissantes: on décrémente les adresses SP ← SP- 4 AVANT écriture (adressage pré- indexé automatique)

-Ecrire la donnée

STR Rd, [SP, #-4]!

(22)

Mise en place d’une pile

Modèles d’évolution de la pile:

Pour dépiler

Mémoire Mémoire

SP

Sens des adresses croissantes

SP ← SP + 4 2

Mise en place d’une pile

Modèles d’évolution de la pile: Full Descending

Mémoire

Dépiler:

-On LIT la dernière donnée dans la pile -accès à l’adresse SP

- 22 - - 22 -

Mémoire

r1

r1 ← mem[SP]word 1

-On incrémente SP ← SP+4 APRES lecture (adressage post-indexé automatique)

-LDR Rd, [SP], #4

(23)

Mise en place d’une pile

Exemple d’utilisation en mode Full Descending

main:

BL DisplayMenu

… displayMenu:

STR LR, [SP, #-4]!

BL displayStr

BL displayStr

BL displayStr

BL displayStr LDR PC, [SP], #4

displayStr:

STR LR, [SP, #

BL DisplayChar

LDR PC, [SP], #4

Mise en place d’une pile

Exemple d’utilisation en mode Full Descending

A chaque appel d’une sous-fonction non terminale:

on empile LR au début, on dépile PC à la fin.

A l’appel d’une sous fonction terminale, LR suffit pour sauvegarder / récupérer l’adresse de retour.

Full descending: remplissage dans le sens des adresses décroissantes:

Empiler: STR LR, [SP, #-4]!

- 23 - - 23 - displayStr:

STR LR, [SP, #-4]!

BL DisplayChar

LDR PC, [SP], #4

displayChar:

MOV PC, LR Empiler: STR LR, [SP, #-4]!

Dépiler: LDR LR, [SP], #4

SP Sens des

adresses croissantes

(lr)

(lr)

SP Sens des

adresses croissantes

(24)

Appel de sous

Précautions nécessaires lors d’appels à sous programmes

Un sous-programme est vu comme une boite noire, la partie visible concerne ses paramètres et sa valeur de retour

Mais

Le programme principal et ses sous

Le programme principal et ses sous manipulent tous les mêmes registres

→ un sous-programme peut modifier des valeurs de registres à l’insu du programme appelant

Lors de l’appel à un sous

souhaite trouver les registres dans le même état qu’avant l’appel

Appel de sous-programmes

Précautions nécessaires lors d’appels à sous-

programme est vu comme une boite noire, la partie visible concerne ses paramètres et sa valeur de retour

Le programme principal et ses sous-programmes

- 24 - - 24 -

Le programme principal et ses sous-programmes manipulent tous les mêmes registres

programme peut modifier des valeurs de registres à l’insu du programme appelant

Lors de l’appel à un sous-programme, l’appelant

souhaite trouver les registres dans le même état

(25)

Appel de sous

Exemple

void main () { int i;

for (i=0; i<10; i++) func1(i);

}

Dans chacun des deux sous-programmes, le symbole i désigne une

variable distincte Ces deux sous programmesutilisent le même registre r1 comme main: mov r1, #0

loop1: cmp r1, #10 bge eloop1 mov r2, r1 bl func1

add r1, r1, #1 b loop1

eloop1: b eloop1

même registre r1 comme compteur de boucle

Au moment d’exécuter cette instruction, r1 a été

modifié par le sous programme func1 et a donc

peu de chances d’être a la valeur souhaitée

En plus de l’adresse de retour, il faut également sauvegarder certaines données contenues dans des registres !!

Appel de sous-programmes

void func1 (int x) { int i;

for (i=0; i<2*x; i++)

…;

} Dans chacun des deux

programmes, le symbole i désigne une

variable distincte Ces deux sous- programmesutilisent le même registre r1 comme

- 25 - - 25 - func1: mov r1, #0

loop2: cmp r1, r2, lsl#1 bge eloop2

add r1, r1, #1 b loop2

eloop2: mov pc, lr même registre r1 comme

compteur de boucle

Au moment d’exécuter cette instruction, r1 a été

modifié par le sous- programme func1 et a donc

peu de chances d’être a la valeur souhaitée

En plus de l’adresse de retour, il faut également sauvegarder certaines données contenues dans des registres !!

(26)

Appel de sous

→ Précautions nécessaires:

A l’entrée d’un sous programme, on sauvegarde les registres utilisés comme variables locales

Avant de sortir, on restaure la valeur de ces registres

Avant de sortir, on restaure la valeur de ces registres

La pile offre un moyen d’allouer dynamiquement de la mémoire pour effectuer cette sauvegarde

Appel de sous-programmes

Précautions nécessaires:

A l’entrée d’un sous programme, on sauvegarde les registres utilisés comme variables locales

Avant de sortir, on restaure la valeur de ces registres

- 26 - - 26 -

Avant de sortir, on restaure la valeur de ces registres

La pile offre un moyen d’allouer dynamiquement de la

mémoire pour effectuer cette sauvegarde

(27)

Appel de sous

Exemple en utilisant la pile

main: mov r1, #0 loop1: cmp r1, #10

bge eloop1

Sauvegarde de r1

bge eloop1 mov r2, r1 bl func1

add r1, r1, #1 b loop1

eloop1: b eloop1

Au moment d’exécuter cette instruction, r1 a été

utilisé par le sous

programme func1, mais sa valeur a été sauvegardée

et rétablie Restauration de r1

Appel de sous-programmes

Exemple en utilisant la pile

func1: STR r1, [SP, #-4]!

mov r1, #0

loop2: cmp r1, r2 , lsl#1 Sauvegarde de r1

SP Sens des

adresses croissantes

(r1)

- 27 - - 27 - loop2: cmp r1, r2 , lsl#1

bge eloop2

add r1, r1, #1 b loop2

eloop2: LDR r1, [SP], #4 mov pc, lr

Au moment d’exécuter cette instruction, r1 a été

utilisé par le sous- programme func1, mais sa

valeur a été sauvegardée et rétablie

Restauration de r1

SP Sens des

adresses croissantes

(r1)

(28)

Appel de sous

Empiler/dépiler une liste de registres (1)

→ Il faut sauvegarder lr, ainsi que les registres programme

foo: str lr, [sp, # str r7, [sp, # str r3, [sp, # str r2, [sp, #

SP Sens des

adresses croissantes

str r2, [sp, # str r1, [sp, #

Fin: ldr r1, [sp], #4 ldr r2, [sp], #4 ldr r3, [sp], #4 ldr r7, [sp], #4 ldr pc, [sp], #4

SP Sens des

adresses croissantes

lr r7 r3 r2 r1

Appel de sous-programmes

Empiler/dépiler une liste de registres (1)

, ainsi que les registres modifiés par le sous

, [sp, #-4]!

str r7, [sp, #-4]!

str r3, [sp, #-4]!

str r2, [sp, #-4]!

Empiler LR en premier

- 28 - - 28 - str r2, [sp, #-4]!

str r1, [sp, #-4]!

ldr r1, [sp], #4 ldr r2, [sp], #4 ldr r3, [sp], #4 ldr r7, [sp], #4 , [sp], #4

Dépiler PC en dernier

(29)

Appel de sous

foo: str lr, [sp, #-4]!

str r7, [sp, #-4]!

str r3, [sp, #-4]!

str r2, [sp, #-4]!

SP r2

r1

Empiler/dépiler plusieurs registres à la fois (2)

Utilisation des instructions de transfert multiples pour accéder à la pile

str r2, [sp, #-4]!

str r1, [sp, #-4]!

ldr r1, [sp], #4 ldr r2, [sp], #4 ldr r3, [sp], #4 ldr r7, [sp], #4 ldr pc, [sp], #4

SP lr

r7 r3 r2

Appel de sous-programmes

foo: STMDB sp!, {r1-r3, r7, lr}

Empiler/dépiler plusieurs registres à la fois (2)

Utilisation des instructions de transfert multiples pour accéder à la pile

- 29 - - 29 -

LDMIA sp!, {r1-r3, r7, pc}

(30)

Appel de sous

Mode Pour empiler

Full Ascending (FA)

STMIA/STMEA STMIB/STMFA Empty Ascending (EA)

Empiler/dépiler plusieurs registres à la fois (3)

Utilisation des instructions de transfert multiples pour accéder à la pile

STMIA/STMEA STMDB/STMFD STMDA/STMED Empty Ascending (EA)

Full Descending (FD) Empty Descending (ED)

Le mode utilisé par défaut sur ARM est le Full Descending:

Pour empiler un registre:

Pour empiler une liste de registres : Pour dépiler un registre :

Pour dépiler une liste de registres :

Appel de sous-programmes

Pour empiler Pour dépiler

LDMDB/LDMEA STMIA/STMEA

LDMDA/LDMFA STMIB/STMFA

Empiler/dépiler plusieurs registres à la fois (3)

Utilisation des instructions de transfert multiples pour accéder à la pile

- 30 - - 30 - LDMDB/LDMEA

STMIA/STMEA

LDMIA/LDMFD STMDB/STMFD

LDMIB/LDMED STMDA/STMED

Le mode utilisé par défaut sur ARM est le Full Descending:

STR Rd, [SP,#-4]!

STMFD SP!,{reglist}

LDR Rd, [SP], #4 LDMFD SP!, {reglist}

(31)

Récapitulatif sur l’utilisation de la pile (1)

Changement de contexte

Au début d’un sous programme: sauvegarde de l’adresse de retour et des registres.

A la fin d’un sous programme: restauration des registres et de l’adresse de retour.

Autre utilisation de la pile

Passage de paramètres

Récapitulatif sur l’utilisation de la pile (1)

Changement de contexte

Au début d’un sous programme: sauvegarde de l’adresse de retour et des registres.

A la fin d’un sous programme: restauration des registres et de l’adresse de retour.

- 31 - - 31 -

Autre utilisation de la pile

Passage de paramètres

(32)

Passage de paramètres

L’utilisation de variables globales pour passer des informations à un sous

déconseillée

Les paramètres sont considérés comme des variables locales de chaque sous

Ils peuvent être transmis de deux façons:

Passage par valeur

Passage par référence (ou par adresse)

Mise en place

Passage par registres

Passage par la pile

Passage de paramètres

L’utilisation de variables globales pour passer des informations à un sous-programme est fortement Les paramètres sont considérés comme des

variables locales de chaque sous-programme

- 32 - - 32 -

Ils peuvent être transmis de deux façons:

Passage par référence (ou par adresse)

(33)

Passage de paramètres

Mise en place: passage par registres

Facile à mettre en place

Rapide à l’exécution (pas d’accès mémoire pour lire ou écrire les données)

Mais Mais

les registres sont en nombre limité, souvent utilisés pour d’autres usages

mêmes inconvénients que les variables globales (risque de modifications non contrôlées)

Passage de paramètres

Mise en place: passage par registres

Facile à mettre en place

Rapide à l’exécution (pas d’accès mémoire pour lire ou

- 33 - - 33 -

les registres sont en nombre limité, souvent utilisés pour

mêmes inconvénients que les variables globales (risque de

modifications non contrôlées)

(34)

Passage de paramètres

Mise en place: passage par registres

Exemple: calcul de PGCD

Le sous-programme prend deux paramètres entiers passés dans r1 et r2

Il renvoie le résultat dans r0

main: mov r1, #24 mov r2, #18 bl pgcd

Les paramètres 24 et 18 sont passés par le programme appelant vers le programme appelé via les registres r1 et r2.

/!\ Ces paramètres sont utilisés et modifiés par la fonction pgcd!! Les valeurs 24 et 18 sont perdues à la fin de l’appel à pgcd.

Passage de paramètres

Mise en place: passage par registres Exemple: calcul de PGCD

programme prend deux paramètres entiers passés Il renvoie le résultat dans r0

pgcd: mov r0, #0 cmp r1, #0 beq epgcd

- 34 - - 34 - cmp r2, #0

beq epgcd loop1: cmp r1, r2

moveq r0, r1 beq epgcd

subgt r1, r1, r2 sublt r2, r2, r1 b loop1

epgcd: mov pc, lr Les paramètres 24 et 18 sont passés par le programme

appelant vers le programme appelé via les registres r1 et r2.

Ces paramètres sont utilisés et modifiés par la fonction pgcd!! Les valeurs 24 et 18 sont perdues à la fin de l’appel à

(35)

Passage de paramètres

Mise en place: passage par la pile

Offre un mécanisme simple d’allocation et de libération dynamique d’espace mémoire: il suffit de déplacer le pointeur de pile

Le programme appelant empile les paramètres

Le sous-programme appelé les lit dans la pile et libère

Le sous-programme appelé les lit dans la pile et libère l’espace occupé au moment de sortir

Exemple: les paramètres à passer sont: 24, 18

Passage de paramètres

Mise en place: passage par la pile

Offre un mécanisme simple d’allocation et de libération dynamique d’espace mémoire: il suffit de déplacer le Le programme appelant empile les paramètres

programme appelé les lit dans la pile et libère

- 35 - - 35 -

programme appelé les lit dans la pile et libère l’espace occupé au moment de sortir

24 18

SP

Exemple: les paramètres à passer sont: 24, 18

Sens des adresses croissantes

(36)

Passage de paramètres

Mise en place: passage par la pile

main: mov r0, #24

str r0, [sp, #-4]!

mov r0, #18

#24

#18

mov r0, #18

str r0, [sp, #-4]!

bl pgcd

add sp, sp, #8

Avant l’appel à la fonction (bl pgcd), on empile les paramètres.

Après l’appel à la fonction (bl pgcd), on libère les paramètres.

Passage de paramètres

Mise en place: passage par la pile

pgcd:

ldr r4, [sp, #4]

ldr r5, [sp]

mov r0, #0 cmp r4, #0 beq epgcd

- 36 - - 36 - beq epgcd

cmp r5, #0 beq epgcd loop1: cmp r4, r5

moveq r0, r4 beq epgcd

subgt r4, r4, r5 sublt r5, r5, r4 b loop1

epgcd: mov pc, lr

(37)

Passage de paramètres

Mise en place: passage par la pile

main: mov r0, #24

str r0, [sp, #-4]!

mov r0, #18

#24

#18 lr r5 r4

mov r0, #18

str r0, [sp, #-4]!

bl pgcd

add sp, sp, #8

Même exemple avec prise en compte de la sauvegarde de l’adresse de retour et des registres modifiés.

/!\ Ne pas sauvegarder le registre utilisé pour le résultat (ici r0)

Passage de paramètres

Mise en place: passage par la pile

pgcd: stmfd sp!, {r4, r5, lr}

ldr r4, [sp, #16]

ldr r5, [sp, #12]

mov r0, #0 cmp r4, #0 beq epgcd

- 37 - - 37 - beq epgcd

cmp r5, #0 beq epgcd loop1: cmp r4, r5

moveq r0, r4 beq epgcd

subgt r4, r4, r5 sublt r5, r5, r4 b loop1

epgcd: ldmfd sp!, {r4, r5, pc}

(38)

Passage de paramètres

Mise en place: passage par la pile

main: mov r0, #24

str r0, [sp, #-4]!

mov r0, #18 mov r0, #18

str r0, [sp, #-4]!

bl pgcd

Même chose en libérant l’espace des paramètres dans la fonction pgcd, donc juste avant de retourner à la fonction appelante (mov pc, lr)

#24

#18 lr r5 r4

SP

Passage de paramètres

Mise en place: passage par

pgcd: stmfd sp!, {r4, r5, lr}

ldr r4, [sp, #16]

ldr r5, [sp, #12]

mov r0, #0 cmp r4, #0 beq epgcd cmp r5, #0

- 38 - - 38 - cmp r5, #0

beq epgcd loop1: cmp r4, r5

moveq r0, r4 beq epgcd

subgt r4, r4, r5 sublt r5, r5, r4 b loop1

epgcd: ldmfd sp!, {r4, r5, lr}

add sp, sp, #8 mov pc, lr

(39)

Récapitulatif sur l’utilisation de la pile (2)

Changement de contexte

Au début d’un sous programme: sauvegarde de l’adresse de retour et des registres modifiés.

A la fin d’un sous programme: restauration des registres et de l’adresse.

Passage de paramètres par la pile

Passage de paramètres par la pile

Dans le programme appelant

Empiler les paramètres

Dans le sous programme appelé

Sauvegarder les registres (le contexte)

Lire les paramètres dans la pile

Traitement de la fonction

Restaurer les registres (le contexte)

Libérer l’espace occupé par les paramètres dans la pile

Récapitulatif sur l’utilisation de la pile (2)

Changement de contexte

Au début d’un sous programme: sauvegarde de l’adresse de retour et des registres modifiés.

A la fin d’un sous programme: restauration des registres et

Passage de paramètres par la pile

- 39 - - 39 -

Passage de paramètres par la pile

Dans le programme appelant Empiler les paramètres

Dans le sous programme appelé

Sauvegarder les registres (le contexte) Lire les paramètres dans la pile

Traitement de la fonction

Restaurer les registres (le contexte)

Libérer l’espace occupé par les paramètres dans la pile

(40)

ARM Procedure Call Standard (APCS)

Pour faciliter l’interfaçage de routines issues de

sources différentes (compilateurs, programmeur), un ensemble de règles a été défini pour standardiser les entrées et sorties de sous

L’APCS permet

de définir une utilisation spécifique des registres

de définir une utilisation spécifique des registres

de définir quel type de pile à utiliser (full/empty,

ascending/descending supporté par le jeu d’instruction)

de définir les mécanismes de passage de paramètres et de résultat utilisés par les fonctions et procédures

etc

ARM Procedure Call Standard (APCS)

Pour faciliter l’interfaçage de routines issues de

sources différentes (compilateurs, programmeur), un ensemble de règles a été défini pour standardiser les entrées et sorties de sous-programmes.

de définir une utilisation spécifique des registres

- 40 - - 40 -

de définir une utilisation spécifique des registres de définir quel type de pile à utiliser (full/empty,

ascending/descending supporté par le jeu d’instruction)

de définir les mécanismes de passage de paramètres et de

résultat utilisés par les fonctions et procédures

(41)

ARM Procedure Call Standard (APCS)

Convention d’utilisation des registres

Registre Nom APCS 0

Description

1 2 3 4

a1 a2 a3 a4 v1

Argument 1 Argument 2 Argument 3 Argument 4

Register variable 1 4

5 6 7 8 9 10 11 12 13 14 15

v1 v2 v3 v4 v5 v6 sl fp ip sp lr pc

Register variable 1 Register variable 2 Register variable 3 Register variable 4 Register variable 5 Register variable 6 Stack Limit

Frame Pointer

Intra-Procedure Scratch register Stack Pointer

Link Address Program Counter

ARM Procedure Call Standard (APCS)

Convention d’utilisation des registres

Description Argument 1 Argument 2 Argument 3 Argument 4

Register variable 1

Passage des 4 premiers paramètres (au delà les paramètres sont passés

la pile)

- 41 - - 41 - Register variable 1

Register variable 2 Register variable 3 Register variable 4 Register variable 5 Register variable 6 Stack Limit

Frame Pointer

Procedure Scratch register Stack Pointer

Link Address Program Counter

Variables locales (registres à sauvegarder en entrée d’un sous-programme)

R11 = fp R13 = sp R14 = lr R15 = pc

(42)

Cadre de pile (stack frame)

La pile est utilisée pour conserver

Les paramètres d’un sous programme

L’adresse de retour

Les valeurs des registres sauvegardés

Les variables locales

On utilise un registre appelé frame pointer

Le registre R11

Il pointe sur le dernier paramètre empilé

Le pointeur de pile SP pointe lui sur le sommet de la zone des variables locales

Cadre de pile (stack frame)

La pile est utilisée pour conserver

Les paramètres d’un sous programme Les valeurs des registres sauvegardés

Mémoire

Variables locales SP

- 42 - - 42 -

On utilise un registre appelé frame pointer

Il pointe sur le dernier paramètre empilé

Le pointeur de pile SP pointe lui sur le sommet de la zone des variables locales

Registres sauvegardés

(dont LR)

Paramètres FP

(43)

Cadre de pile (stack frame)

Exemple d’utilisation

foo: stmfd sp!, {r3 sub fp, sp, #40 sub sp, sp, #100 main: str r4, [sp, #-4]!

str r5, [sp, #-4]!

str r6, [sp, #-4]!

bl foo

add sp, sp, #100

ldmfd sp!, {r3

add sp, sp, #12

mov pc, lr bl foo

Cadre de pile (stack frame)

stmfd sp!, {r3-r8, fp, lr} @ save registers

sub fp, sp, #40 @ set FP

sub sp, sp, #100 @ allocate 100

@ octets for

@ local var

- 43 - - 43 -

@ local var

add sp, sp, #100 @ free local

@ var space ldmfd sp!, {r3-r8, fp, lr} @ reload

@ register

@ context

add sp, sp, #12 @ free parameter

@ space

mov pc, lr @ return

(44)

ARM Procedure Call Standard (APCS)

Modèle de pile: Full Descending

Cadre de pile

ARM Procedure Call Standard (APCS)

Modèle de pile: Full Descending

Variables locales

Registres SP

Sens des adresses croissantes

- 44 - - 44 -

Registres sauvegardés

(r0 à r9)

Paramètres FP

FP SP LR PC Optionnel

Références

Documents relatifs

Université Paris-Dauphine Licence de Mathématiques Appliqués. Intégrale de Lebesgue et Probabilités

Montrer que F est de classe C ∞ sur R et vérie une équation diérentielle linéaire du second ordre..

Dans ce cas on « transforme » une des deux variables à l’aide d’une fonction pour obtenir un nouveau nuage qui aura la forme d’une droite. Exemple 12.5 (D’après

Montrer que f est solution d'une équation diérentielle linéaire sur D

3- A l’aide de vos connaissances et des documents, développer un argumentaire pour convaincre l’agriculteur producteur de pommes de terre de fertiliser différemment

&#34;Riemann ordinaire pour laquelle x\ reste inférieur à un nombre fixe r. Ces cercles, les lignes de ramification qui. Coursât {Bulletin de la Société rnathématique de Fmnce^

Ainsi le stabili- sateur d'une loi de groupe de hauteur finie à coefficients dans un corps K de caractéristique p algébriquement clos est invariant pour toute extension de K.

ne contiendra plus t dans sa portion de degré zéro. Ainsi : Pour qu'un système à fonction V possède ^intégrale des forces vives^ il faut et il suffit qu 7 il possède une