Conception et exploitation des processeurs

publicité
Notes
Conception et exploitation des processeurs
Chargés de cours : Frédéric Pétrot et Sébastien Viardot
Année universitaire 2011-2012
Conception et exploitation des processeurs
Structure du cours
C1
C2
C3
Notes
Introduction au VHDL
Introduction aux langages d'assemblage
pour les ISA x86 et MIPS
Conventions pour les appels de fonctions
en assembleur x86 et MIPS
2 / 21
Conception et exploitation des processeurs
Introduction
Notes
Plan
1
Introduction
2
ABI x86
3
ABI MIPS
3 / 21
Conception et exploitation des processeurs
Introduction
Notes
Introduction
Fonction
Ensemble d'instructions réalisant une tâche donnée pouvant être
appelée à divers points d'un programme et retournant après le
point d'appel une fois exécutée
Une fonction :
prend 0, 1 ou n paramètre(s) et retourne un résultat
utilise des variables locales dont la durée de vie est celle de la
fonction
peut utiliser des variables globales dont la durée de vie est celle
du programme
ou des pointeurs sur le tas dont la durée de vie est déterminée
par le programme
4 / 21
Conception et exploitation des processeurs
Introduction
Notes
Introduction
Fonctions : Notion d'appelante et d'appelée
/* Fonction appelante */
int32_t sos(int x)
{
/* variables locales */
int32_t u, v, w;
u = square(x);
/*^point de retour de la
première invocation */
v = square(x);
/*^point de retour de la
deuxième invocation */
w = u + v;
/* valeur de retour */
return w;
}
/* Fonction appelée */
int32_t square(int32_t y)
{
/* variable locale */
int32_t u;
u = y * y;
/* valeur de retour */
return u;
}
5 / 21
Conception et exploitation des processeurs
Introduction
Notes
Introduction
Contexte d'exécution
Il contient :
les paramètres, ou au moins de la place pour eux
les variables locales
les registres dont les valeurs doivent être sauvegardés pour
l'appelant
l'adresse de retour dans l'appelant
Principes
création d'un contexte d'exécution pour chaque invocation
utilisation du contexte pour l'exécution de la fonction
destruction du contexte lors du retour de fonction
contextes crées et détruits dans une pile
appels imbriqués
appels successifs
empilement et dépilement des contextes
création contextes dans même zone de pile
6 / 21
Conception et exploitation des processeurs
Introduction
Notes
Introduction
Programmation des fonctions
Repose sur des conventions spéciques à chaque architecture de
processeur :
utilisation des registres
support matériel ad-hoc
C'est l'Application Binary Interface (ABI)
7 / 21
Conception et exploitation des processeurs
ABI x86
Notes
Plan
1
Introduction
2
ABI x86
3
ABI MIPS
8 / 21
Conception et exploitation des processeurs
ABI x86
Notes
ABI x86
Instructions d'appel et retour de fonction
call func : saute à adresse étiquette func, empile adresse
instruction suivant call, dite adresse de retour
ret : dépile adresse sauvée par call et y saute
Structuration de la pile (stack
adresses hautes
⇓
..
.
⇓
adresses basses
)
frame
paramètres d'entrée
adresse de retour
optionnel
systématique
%ebp précédent
variables locales
registres à sauver
systématique
optionnel
optionnel
9 / 21
Conception et exploitation des processeurs
ABI x86
Notes
ABI x86
Registres spécialisés
%esp (pointeur de pile) : contient adresse de la dernière case
occupée dans pile
%ebp (pointeur de contexte) : contient adresse de base
contexte d'exécution (adresse dans pile de %ebp précédent)
utilisé pour accéder au contexte : -4(%ebp) par ex.
Mise en place de la structuration de la pile
Une responsabilité partagée :
appelante : empile valeur paramètres dans l'ordre, empile
adresse de retour implicitement en appelant call
appelée : réserve la place nécessaire à son propre contexte
d'exécution
10 / 21
Conception et exploitation des processeurs
ABI x86
Notes
ABI x86
Utilisation des autres registres :
Modiables par la fonction appelée (scratch ou clobber)
%eax, %ecx, %edx, %eflags
À sauver dans l'appelante si valeurs nécessaires après le retour de
l'appelée
À préserver dans la fonction appelée (non-scratch ou preserved)
%ebx, %esi, %edi
À sauver puis restaurer dans l'appelée si elle en fait usage
11 / 21
Conception et exploitation des processeurs
ABI x86
Notes
ABI x86
En pratique :
Dans la fonction appelée
calculer la place nécessaire aux variables locales et registres à sauver
empiler %ebp, sauver %esp dans %ebp
créer l'espace dans la pile pour variables locales et registres en déplaçant
%esp
pushl %eax, empile registre, popl %eax, dépile et sommet dans registre
mise en place
enter $N, $0
≡
retour à l'état précédent
leave
≡
pushl %ebp
movl %esp, %ebp
subl $N, %esp
movl %ebp, %esp
popl %ebp
≡
≡
subl
movl
movl
subl
$4, %esp
%ebp, (%esp)
%esp, %ebp
$N, %esp
movl %ebp, %esp
movl (%esp), %ebp
addl $4, %esp
12 / 21
Conception et exploitation des processeurs
ABI x86
Notes
ABI x86
Exemple :
int32_t plus(void)
{
int32_t a = 5;
int32_t b = 4;
return a + b;
}
plus: enter $8, $0
movl $5, -4(%ebp) ; a <- 5
movl $4, -8(%ebp) ; b <- 4
movl -4(%ebp), %eax
addl -8(%ebp), %eax
leave
ret
Pile après le enter et avant le leave :
adresses hautes
adresse de retour
%ebp précédent
a=5
b=4
⇓
⇓
adresses basses
%ebp + 4 = %esp précédent
%ebp
%ebp - 4
%ebp - 8 = %esp
13 / 21
Conception et exploitation des processeurs
ABI x86
Notes
ABI x86
Appels imbriqués :
int main(void)
{
int x = plus();
return 0;
}
main: enter $4, $0
call plus
movl %eax, -4(%ebp)
leave
movl $0, %eax
ret
État de la pile avant le leave de plus :
adresses hautes
⇓
.
.
.
⇓
adresses basses
adresse de retour au système
%ebp du système
x =?
adresse de retour à main
%ebp de main
a=5
b=4
14 / 21
Conception et exploitation des processeurs
ABI x86
Notes
ABI x86
Passage et récupération de paramètres :
int32_t plus(
int32_t a,
int32_t b)
{ return a + b;}
int32_t main(void)
{
int32_t x;
x = plus(5, 4);
return 0;
}
adresses hautes
⇓
main:
enter $4, $0
pushl $5
pushl $4
call plus
addl $8, %esp
movl %eax, -4(%ebp)
leave
movl $0, %eax
ret
adresse de retour au système
%ebp
du système
...
x =?
...
5
...
⇓
adresses basses
4
de
%ebp
dans
main
main
$0, $0
12(%ebp), %eax
8(%ebp), %eax
main
paramètre
a
b
%ebp
plus
paramètre
adresse de retour à
%ebp
plus:
enter
movl
addl
leave
ret
dans
dans
dans
plus
plus
15 / 21
Conception et exploitation des processeurs
ABI MIPS
Notes
Plan
1
Introduction
2
ABI x86
3
ABI MIPS
16 / 21
Conception et exploitation des processeurs
ABI MIPS
Notes
ABI MIPS
Instructions d'appel et retour de fonction
jal func : saute à adresse étiquette func, sauve adresse
instruction suivante dans $31
jalr $2 : saute à adresse contenue dans $2, sauve adresse
instruction suivante dans $31
jr $31 : retourne à l'appelant ($ra)
Pas d'instruction de manipulation de la pile
Une seule opération de déplacement de pile dans une fonction : le
plus grand nécessaire
addiu : fait croître et décroître le pointeur de pile
lw, sw : mise à jour des données dans la pile
$29 ($sp) : pointe toujours sur la dernière case occupée
17 / 21
Conception et exploitation des processeurs
ABI MIPS
Notes
ABI MIPS
Structuration de la pile (stack
adresses hautes
⇓
⇓
adresses basses
)
frame
espace pour paramètres
adresse de retour
registres à sauver
variables locales
systématique
optionnel
optionnel
optionnel
Convention d'usage des registres
Registre
$0
$1
$2-$3
$4-$7
$8-$15,$24,$25
$16-$23,$30
$26-$27
$28
$29
$31
Nom
$0
$at
$v0-$v1
$a0-$a3
$t0-$t9
$s0-$s8
$k0-$k1
$gp
$sp
$ra
Usage
toujours 0
réservé à l'assembleur
valeur(s) de retour
4 premiers arguments (scratch)
temporaires (scratch)
à sauver (non-scratch)
réservés au noyau
pointeur global
pointeur de pile
adresse de retour
18 / 21
Conception et exploitation des processeurs
ABI MIPS
Notes
ABI MIPS
Passage et récupération des paramètres
les 4 premiers paramètres dans $4, $5, $6 et $7
f(...) {
g(...);
k(...);
}
g(...) {
h(...);
}
adresses
hautes
⇓
déplacement dans
f()
compatible
appel g() et appel
k()
mise en place argu⇓
ments dépendant adresses
de déplacement
basses
5ème paramètre
place pour $7
place pour $6
place pour $5
place pour $4
valeur de $31
autres registres
à sauver
variables locales
paramètre n − 1
paramètre 5
place pour $7
place pour $6
place pour $5
place pour $4
et les autres au dessus
utilisé uniquement si
la fonction appelée (g) les
modie
$29 dans appelante (f)
adresse de retour
lors de l'appel d'une
autre fonction (h)
lors appel suivant (h)
$29 dans appelée (g)
19 / 21
Conception et exploitation des processeurs
ABI MIPS
Notes
ABI x86
Exemple, la factorielle, enn !
int f(int n)
{
return
n <= 1
? 1
: n
*
f(n-1);
}
f:
addiu
sw
sw
slt
bne
add
addiu
jal
mult
mflo
j
L3: li
L2: lw
lw
addiu
j
$sp,$sp,-24
$31,20($sp)
$16,16($sp)
$2,$4,2
$2,$0,L3
$16,$4,$0
$4,$4,-1
f
$2,$16
$2
L2
$2,1
$31,20($sp)
$16,16($sp)
$sp,$sp,24
$31
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
args + ra + 1 non-scratch
empile $31 (ra)
empile $16 (non-scratch)
si < 2
va en L3
sauve n dans $16
n <- n-1
appel récursif
n * valeur de retour
resultat dans $2
saut vers epilogue
valeur de retour 1
recupère ra
restaure $16
élimine la pile courante
retour à l'appelant
20 / 21
Conception et exploitation des processeurs
ABI MIPS
Notes
En Résumé
ABI
Usage des registres
imposé par le matériel
ou reposant sur des conventions
Souvent un mix des 2
Appels de fonctions
responsabilité partagée en fonction appelante et appelée
structure prédénie et acceptée : prix à payer pour la
compatibilité
fonction appelante ne sait pas ce que fait fonction appelée, ne
connaît que son prototype
basée sur des conventions qu'il faut suivre
21 / 21
Téléchargement