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
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
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
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
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
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) {
… }
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)
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)!!
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)!!
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
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
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)
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
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
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
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
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"
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
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
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
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]!
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
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
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
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 !!
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
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)
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
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}
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}
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
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)
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)
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 à
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
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
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}
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
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
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
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
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
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
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