CM3 Assembleur MIPS (suite)

publicité
CM3
Assembleur MIPS (suite)
Olivier Marchetti (CM-TD-TP)
Laurent Lambert (TD-TP)
Laboratoire d’informatique de Paris 6 – Pôle SoC – UPMC
Année 2016-2017
Instructions de saut ? Fonction ? Remarques programmation
Passer du C à l’assembleur MIPS : rappels (1/3)
Programmer en ensembleur... ou se substituer au compilateur
Savoir précisément où écrire, où lire.
CPU
00011110
=⇒ orchestrer un va-et-vient entre CPU et RAM.
Pour cela, il faut :
I effectuer des calculs d’adresses mémoire,
I charger/décharger certains registres depuis/vers la RAM.
11000101
| mot |
2
−1
| mot |
2
−2
$Reg
C
Syntaxe MIPS
valeur de $s
valeur de $s
Chargement d’un registre (lw : load word) :
01001100
lw $t, C($s) ⇐⇒ $t ← RAM[$s + C]
11100000
00101101
Déchargement d’un registre (sw : store word) :
sw $t, C($s) ⇐⇒
Olivier Marchetti
RAM[$s + C] ← $t
CM3 – Assembleur MIPS (suite)
2
1
0
RAM @
Année 2016-2017
2 / 32
Instructions de saut ? Fonction ? Remarques programmation
Passer du C à l’assembleur MIPS : rappels (2/3)
Programmer en ensembleur... ou se substituer au compilateur
Etiquettes
Dir{Seg. mém, visib., données} – Instr.
↓
↓
Savoir organiser les données dans le code assembleur.
=⇒ préciser la localisation en RAM, la nature et la visibilité.
...
Syntaxe MIPS
I Description des données : asciiz, word...
I Visibilité : globl, extern.
Olivier Marchetti
↓
.data
tab ent :
Utilisation de directives assembleur dans le code :
I Segment mémoire : .data, .text...
Commentaires
.word 1,2,3,4
...
...
.text
.globl main
# main → global
...
...
...
main :
la $r, tab ent
# $r ← tab ent
...
...
...
CM3 – Assembleur MIPS (suite)
Année 2016-2017
3 / 32
Instructions de saut ? Fonction ? Remarques programmation
Passer du C à l’assembleur MIPS : rappels (3/3)
Programmer en ensembleur... ou se substituer au compilateur
Réinventer les structures de contrôle en jouant avec des
étiquettes assembleurs.
=⇒ organiser des sauts d’instructions avec PC
Syntaxe MIPS
Utilisation d’instructions MIPS dans le code :
I Branchements conditionnels : beq, bne, slt...
I Branchements inconditionnels : j.
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
4 / 32
Instructions de saut ? Fonction ? Remarques programmation
Plan
1
Programmation en assembleur MIPS : saut sur instructions
Assembleur MIPS : prendre des décisions
Structure de contrôle switch - case
2
Programmation en assembleur MIPS : fonction
Généralités sur les fonctions en MIPS
Implémentation MIPS de la pile
3
Quelques remarques sur le langage assembleur MIPS
Programmation et conventions
Langage de haut-niveau & langage assembleur
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
5 / 32
Instructions de saut ? Fonction ? Remarques programmation
Branchement ? Switch
1
Programmation en assembleur MIPS : saut sur instructions
Assembleur MIPS : prendre des décisions
Structure de contrôle switch - case
2
Programmation en assembleur MIPS : fonction
Généralités sur les fonctions en MIPS
Implémentation MIPS de la pile
3
Quelques remarques sur le langage assembleur MIPS
Programmation et conventions
Langage de haut-niveau & langage assembleur
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
6 / 32
Instructions de saut ? Fonction ? Remarques programmation
Branchement ? Switch
Le guidage du flot d’instructions et le langage assembleur (1/5)
Comment orienter le flot d’instructions avec le langage assembleur ?
=⇒ Programmation assembleur = programmation avec goto !
Mémoire du programme
Mem.
dispo.
Tas
données stat.
$gp
.data
Programme
$pc
0 110
111 01110 1
00 10
R
OU
j P
.text
@
NumLigne
Cycle CDE, langage machine et langage assembleur MIPS
I A chaque passage dans ce cycle, une instruction est lue et PC est ajusté.
I Cette instruction est encodée en binaire en RAM sur 4 octets.
I Programme assembleur = une instruction MIPS par ligne.
I Programme en mémoire ≈ suite des instructions encodées sur 4 octets =⇒ toutes adressées !
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
7 / 32
Instructions de saut ? Fonction ? Remarques programmation
Branchement ? Switch
Le guidage du flot d’instructions et le langage assembleur (2/5)
Peut-on réaliser un switch avec des instructions beq, bne et des j Etq ?
=⇒ Oui !
Structure de contrôle Selon cas en C
switch(k) { // avec k de type int.
case 0 : instructions etq 0
break;
case 1 : instructions etq 1
break;
...
case n : instructions etq n
break;
default : instructions etq n
break;
}
Avec dans ce code assembleur :
I $t0 stocke la valeur de k,
I
Structure de contrôle Selon cas en MIPS (essai)
1| SELON : beq $t0, $t1, ETQ0
2|
addi $t1, $t1, 1
3|
beq $t0, $t1, ETQ1
4|
addi $t1, $t1, 1
5|
...
6|
beq $t0, $t1, ETQN
7|
j DEFAUT
8| ETQ0 : instructions etq 0
9|
j SUITE
10|
...
11| ETQN : instructions etq n
12|
j SUITE
13| DEFAUT : instructions defaut
14|
j SUITE
15| SUITE :
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
$pc
$t1
$pc
$t1
←
←
←
←
ETQ0
$t1 + 1
ETQ1
$t1 + 1
$pc ← DEFAUT
$t1 stocke la valeur 0.
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
8 / 32
Instructions de saut ? Fonction ? Remarques programmation
Branchement ? Switch
Le guidage du flot d’instructions et le langage assembleur (3/5)
Est-ce bien un switch ?
=⇒ Non, ce n’est pas un switch !
I Structure switch : branchement en
temps constant.
6=
I Ici, le nombre de tests effectués sera
borné par le nombre d’étiquettes.
=⇒
Impossible à réaliser
avec beq, bne et j.
Olivier Marchetti
Structure de contrôle Selon cas en MIPS (essai)
1| SELON : beq $t0, $t1, ETQ0
2|
addi $t1, $t1, 1
3|
beq $t0, $t1, ETQ1
4|
addi $t1, $t1, 1
5|
...
6|
beq $t0, $t1, ETQN
7|
j DEFAUT
8| ETQ0 : instructions etq 0
9|
j SUITE
10|
...
11| ETQN : instructions etq n
12|
j SUITE
13| DEFAUT : instructions defaut
14|
j SUITE
15| SUITE :
CM3 – Assembleur MIPS (suite)
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
$pc
$t1
$pc
$t1
←
←
←
←
ETQ0
$t1 + 1
ETQ1
$t1 + 1
$pc ← DEFAUT
Année 2016-2017
9 / 32
Instructions de saut ? Fonction ? Remarques programmation
Branchement ? Switch
Le guidage du flot d’instructions et le langage assembleur (4/5)
Comment réaliser convenablement un switch en assembleur ?
=⇒ En s’appuyant sur une table de saut dans le segment des données.
I Calculer l’adresse mémoire de T SAUT[k] (1).
I Demander le mot mémoire d’adresse T SAUT[k] (2 & 3).
I Ajuster PC de sorte à désigner l’instruction d’adresse T SAUT[k] (4).
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
10 / 32
Instructions de saut ? Fonction ? Remarques programmation
Branchement ? Switch
Le guidage du flot d’instructions et le langage assembleur (5/5)
Méthodologie pour réaliser un switch en assembleur
1
Faire un tableau d’étiquettes T SAUT
dans le segment des données.
2
Former l’entier k dans un registre.
3
Former l’adresse mémoire de
T SAUT[k] (avec la : load address).
4
Charger T SAUT[k] dans un registre.
5
Charger $pc par ce registre.
Saut sur registre – jr $r (jump register )
jr $r
Au niveau registre :
jr $r ⇐⇒ PC ← $r
Remarques – Niveau logiciel
X Bien réaliser le tableau d’étiquettes.
X Structure peu pratique au niveau langage assembleur.
Olivier Marchetti
Structure de contrôle Selon cas en MIPS
1| SELON : sll $t0, $t0, 2
2|
la $t1, T SAUT
3|
add $t2, $t0, $t1
4|
lw $t2, 0($t2)
5|
jr $t2
6| ETQ0 : instructions etq 0
7|
j SUITE
8| ETQ1 : instructions etq 1
9|
j SUITE
10|
...
11| ETQN : instructions etq n
12|
j SUITE
13| DEFAUT : instructions defaut
14|
j SUITE
15| SUITE :
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
$t0
$t1
$t2
$t2
$PC
←
←
←
←
←
$t0 × 4
T SAUT
@T SAUT[k]
ETQK
ETQK
Remarques – Niveau matériel
√
Temps constant & très efficace.
X Mal exploitée par les architectures modernes (à cause
de l’instruction jr).
CM3 – Assembleur MIPS (suite)
Année 2016-2017
11 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
1
Programmation en assembleur MIPS : saut sur instructions
Assembleur MIPS : prendre des décisions
Structure de contrôle switch - case
2
Programmation en assembleur MIPS : fonction
Généralités sur les fonctions en MIPS
Implémentation MIPS de la pile
3
Quelques remarques sur le langage assembleur MIPS
Programmation et conventions
Langage de haut-niveau & langage assembleur
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
12 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Programmation vs. Programmation MIPS
Pour bien programmer, de quoi avons-nous besoin ?
1
Réaliser des calculs
(arithmétiques ou logiques).
2
Effectuer des transferts de
données.
3
Manipuler des constantes.
..
.
Olivier Marchetti
7
Effectuer des entrées/sorties
élémentaires.
8
Disposer de l’abstraction
fonction.
CM3 – Assembleur MIPS (suite)
Année 2016-2017
13 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : retour sur le concept de fonction
Qu’est-ce qu’une fonction ?
I
entrées
produisant une unique valeur de
retour.
Ces deux caractéristiques définissent
une interface pour l’extérieur (la
réalisation interne importe peu).
Entrée_1
. . . .
C’est une boı̂te noire :
I travaillant
sur
des
spécifiques (i.e. typées),
Sortie
Entrée_k
type Sortie f(type Entrée_1,..., type Entrée_k)
Concepts et architecture
1
Type, variable, fonction sont des concepts de programmation sans réel analogue
en architecture.
2
Possibilité de créer de toute pièce en langage assembleur le concept de fonction :
• conserver cette notion de boı̂te noire,
• conserver cette notion d’interface,
• définir un mécanisme logiciel/matériel effectif respectant ces deux notions.
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
14 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : réaliser une fonction (1/8)
Comment disposer de l’abstraction de programmation
fonction en MIPS ?
=⇒ Etiquettes & sauts !
Petit problème...
Notre fonction assembleur a connaissance de qui l’a
appelée...
6=
=⇒
Olivier Marchetti
boı̂te noire.
ce n’est pas le concept d’une fonction !
CM3 – Assembleur MIPS (suite)
Année 2016-2017
15 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : réaliser une fonction (2/8)
Que doit faire le processeur pour réaliser un appel de fonction ?
1
Sauvegarder
l’adresse consécutive
à celle du site
d’appel (i.e.
l’adresse de retour).
2
Effectuer le
branchement en
ajustant PC.
Olivier Marchetti
3
Exécuter le code de
la fonction appelée.
CM3 – Assembleur MIPS (suite)
4
Effectuer le
branchement en
ajustant PC vers
l’adresse mémorisée
précédemment.
Année 2016-2017
16 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : réaliser une fonction (3/8)
Comment disposer de l’abstraction de programmation
fonction en MIPS ?
=⇒ Etiquettes, sauts et liaison & saut sur registre !
Comment l’ordinateur retourne-t-il au point d’appel de la fonction appelante ?
=⇒ sauvegarder dans un registre l’adresse contenue dans $PC lors de l’appel !
Saut et liaison – jal EtqFct (jump and link)
Saut sur registre – jr $r (jump register )
jal EtqFct
Au niveau registre :
jal EtqFct ⇐⇒ 1) Sauvegarde de l’adr. de l’instr. suiv.,
$ra ← PC + 4
2) Mise à jour de PC,
PC ← PC + 4[31...28].4×EtqFct
(concaténation des premiers bits $PC et ceux de l’étiquette)
Olivier Marchetti
jr $r
Au niveau registre :
jr $r ⇐⇒ PC ← $r
Utilisée avec $ra, cela permet de retourner
au point d’appel.
CM3 – Assembleur MIPS (suite)
Année 2016-2017
17 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : réaliser une fonction (4/8)
Que doit faire le logiciel pour réaliser l’exécution d’une telle fonction ?
Juste avant l’appel de la fonction
1
Positionner les arguments à
un endroit standard pour
l’appelée (usuellement
$a0...$a3).
Olivier Marchetti
A l’appel
2
Effectuer un branchement
de code (i.e. copier le
registre $PC dans $ra et
effectuer un saut).
CM3 – Assembleur MIPS (suite)
A l’exécution de la fct. appelée
3
Créer en RAM un espace
pour ses variables locales.
4
Exécuter le code.
5
Charger le résultat de la
fonction dans un registre
pour l’appelant
(usuellement $v0, $v1).
6
Recouvrer le flot
d’instructions de la
fonction appelante.
Année 2016-2017
18 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : réaliser une fonction (5/8)
Qu’arrive-t-il si la fonction appelée en appelle à son tour une autre ?
A l’exécution
I
I
Premier appel :
jal somme ⇐⇒ 1) $ra ← µ
2) PC ← Σ
Deuxième appel :
jal somme ⇐⇒ 1) $ra ← χ
2) PC ← Σ
Olivier Marchetti
L’adresse de retour du premier appel a été
écrasée ! ! !
√
√
=⇒ un saut avec liaison est insuffisant.
Comment garder la trace des appels
précédents ?
X
X
=⇒ définir et sauvegarder un
contexte d’exécution.
CM3 – Assembleur MIPS (suite)
Année 2016-2017
19 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : réaliser une fonction (6/8)
Comment organiser en mémoire ces contextes d’exécution ?
Une fonction se termine lorsque les appels internes de cette fonction sont tous
complétés. C’est une politique :
dernier entré, premier servi ⇐⇒ c’est la pile !
somme(0)
jr $ra
jal
somme(1)
jal
somme(2)
main()
jr $ra
jr $ra
jal
☞
t
Début somme(2)
✌
Fin somme(2)
Exécuter une fonction sur le CPU :
1 Sauvegarder le contexte (i.e. tous les registres nécessaires).
EMPILER
2
Exécuter les instructions du corps de la fonction.
3
Restituer le contexte d’exécution, et reprendre le flot d’instructions.
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
DEPILER
Année 2016-2017
20 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : réaliser une fonction (7/8)
Où mettre/récupérer un contexte d’exécution de fonction ?
=⇒ En RAM !
Mémoire du programme
$sp
Contexte
d’exécution
somme(2)
Mem.
dispo.
Seg. données
Contexte
d’exécution
somme(1)
Tas
données stat.
$gp
.data
Seg. texte
Programme
Contexte
d’exécution
somme(0)
$sp
RAM
@
Pile : registres $fp/$sp (frame/stack pointer )
I
$fp
$pc
.text
I
Contexte
d’exécution
main()
$fp
@
$sp désigne l’adresse du sommet de la pile.
Pile
Définir un bloc de pile
$fp définit l’adresse du bloc mémoire pile
de la fonction courante.
Olivier Marchetti
Croissance de la pile
Pile
Seg. pile
1
$fp ← $sp
2
$sp ← $sp - TailleBloc
où TailleBloc est un multiple
de 8 octets (alignement mémoire).
CM3 – Assembleur MIPS (suite)
Année 2016-2017
21 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : réaliser une fonction (8/8)
Comment gérer la sauvegarde/restitution de registres, la pile, le passage des arguments,
la valeur de retour ?
=⇒ Selon une convention logicielle entre la fonction appelante et l’appelée.
Registres à sauvegarder lors d’un appel
Nom
Numéro
Usage
$v0–$v1
$2–$3
Val. retour
Appelante
√
[ ]
et Rés. fonction
√
Appelée
–
$a0–$a3
$4–$7
Arg. fonct.
[
$t0–$t7
$8–$15
Temp.
[
$s0–$s7
$16–$23
Temp. sauv.
$t8–$t9
$24–$25
Temp.
–
√
[ ]
$sp
$29
Pointeur pile
–
[
$fp
$30
Pointeur bloc
–
[
$ra
$31
Adr. retour
–
[
√
]
–
]
–
√
[ ]
–
√
√
√
]
]
]
Compilateurs et programmeurs
respectent des conventions.
Deux conventions standard : sauvegarde par l’appelante/l’appelée
I
Celle qui sauvegarde une donnée se charge également de la restituer.
I
Limiter les accès à la pile grâce à une analyse de l’usage des registres.
I
Répartir (et limiter) le code d’appel entre le bloc appelant et le bloc appelé.
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
22 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : implémentation d’une pile (1/4)
Comment le logiciel décrit-il un appel standard de fonction ?
=⇒ Cinq étapes : ouverture, prologue, exécution, épilogue, final.
1
OUVerture : l’appelante prépare la réalisation effective de l’appelée (sauvegarde
éventuelle de registres).
2
PROlogue : l’appelée prépare son bloc de données sur la pile.
3
EXECUTION : l’appelée exécute ses instructions propres.
4
EPIlogue : l’appelée rend la main en restituant le contexte de l’appelant et en
dépilant son bloc mémoire de la pile.
5
FINal : l’appelante restaure éventuellement des registres et reprend le code de la
fonction implémentée.
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
23 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : implémentation d’une pile – OUVERTURE (2/4)
$fp
Contexte
d’exécution
appelante
$fp
Contexte
d’exécution
appelante
$fp
Contexte
d’exécution
appelante
$t9
...
$t0
Libre
$t9
...
$t0
$a3
...
$a0
(sup. 4 mots)
$sp
@
Zone arguments
argSup_k
...
argSup_1
$sp
Etat initial
@
$sp
Etat fin 2
@
Etat fin 4
Ouverture - fonction appelante
1
Sauvegarder (si nécessaire) les registres temporaires $t0-$t9.
2
Passage des arguments à l’appelée par les registres $a0-$a3.
3
Empiler les arguments supplémentaires.
4
Sauvegarder (si nécessaire) les registres arguments $a0-$a3.
5
L’appelante invoque l’appelée par un jal.
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
24 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : implémentation d’une pile – PROLOGUE (3/4)
$fp
Contexte
d’exécution
appelante
Contexte
d’exécution
appelante
...
...
...
argSup_k
...
argSup_1
argSup_k
...
argSup_1
argSup_k
...
argSup_1
$a3
...
$a0
$a3
...
$a0
$a3
...
$a0
$fp
$sp
@
Contexte
d’exécution
appelante
$fp
[$ra]
$fp
Etat initial
[$ra]
$fp
$s7
...
$s0
Si l’appelée comporte un
appel (i.e. l’appelée
devient appelante),
prévoir un bloc de pile
conséquent.
varLoc_k
...
varLoc_1
$sp
@
$sp
Etat fin 3
@
Etat fin 5
Prologue - fonction appelée
1
Agrandir la pile en ajoutant un bloc mémoire (multiple de 8 octets).
2
Empilement du registre $ra (si l’appelée comporte un appel) et $fp.
3
Ajustement de $fp.
4
Sauvegarde (si nécessaire) des registres $s0-$s7.
5
Empilement des variables locales de l’appelée.
$sp ← $sp − TailleBloc
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
25 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : implémentation d’une pile – EPILOGUE & FINAL (4/4)
Contexte
d’exécution
appelante
Epilogue – fonction appelée
1
2
3
Si l’appelée retourne une valeur, celle-ci
est placée dans $v0.
Restituer tous les registres sauvegardés
par l’appelée lors du prologue (rétablir
$ra et $fp).
Contexte
d’exécution
appelante
...
...
argSup_k
...
argSup_1
argSup_k
...
argSup_1
$a3
...
$a0
$a3
...
$a0
$fp
$sp
[$ra]
$fp
Dépiler le bloc mémoire de l’appelée :
$sp ← $sp + TailleBloc
4
$fp
@
Etat final
$s7
...
$s0
Retourner à l’appelant avec un jr $ra.
varLoc_k
...
varLoc_1
$sp
@
Etat initial
Final – fonction appelante
1
Restituer tout ce que l’appelante avait sauvegardé lors du prologue.
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
26 / 32
Instructions de saut ? Fonction ? Remarques programmation
Fonctions en MIPS ? Implémentation MIPS
Assembleur MIPS : Exemple complet
Le programme suivant effectue un appel à une fonction qui réalise la somme des
n = 10 premiers entiers.
Remarques
1
Un code assembleur dépend du matériel, du SE utilisé (alignement mémoire).
=⇒ contraintes décrites par l’Application Binary Interface.
2
Aucune contrainte d’utilisation des registres usagers (sauf $zero).
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
27 / 32
Instructions de saut ? Fonction ? Remarques programmation
Convention ? C & ASM
1
Programmation en assembleur MIPS : saut sur instructions
Assembleur MIPS : prendre des décisions
Structure de contrôle switch - case
2
Programmation en assembleur MIPS : fonction
Généralités sur les fonctions en MIPS
Implémentation MIPS de la pile
3
Quelques remarques sur le langage assembleur MIPS
Programmation et conventions
Langage de haut-niveau & langage assembleur
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
28 / 32
Instructions de saut ? Fonction ? Remarques programmation
Convention ? C & ASM
Quelques mots sur la convention d’appel
The nice thing about standards is that you have so many to choose from. [Andrew Tanenbaum, Computer Networks, 2nd ed., p. 254]
Code GCC :
√
I conforme à la convention
I
peu intuitif (usage étrange de $fp & $sp) X
I
très efficace !
registre 6= variable
sauvegarder 6= empiler
restituer 6= dépiler
La sauvegarde/restitution des données dans la convention
La convention spécifie ce processus au niveau code de sorte à garantir :
I l’intégrité des données du programme,
I
le fonctionnement cohérent de la pile.
l’interopérabilité de modules issus de programmes écrits dans différents langages.
Programmeurs/compilateurs disposent d’une grande liberté pour mettre en oeuvre
cette convention.
√
optimisation en vue
...
certification X
I
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
29 / 32
Instructions de saut ? Fonction ? Remarques programmation
Convention ? C & ASM
Langage haut-niveau : qu’est-ce qu’un pointeur ?
Quelles différences y-a-t-il entre un pointeur et une variable de type tableau ?
Rappels sur le langage C
Variable pointeur : c’est une variable pouvant contenir une adresse mémoire.
Variable tableau : c’est un pointeur constant valant l’adresse du 1er élément.
Hypothèses :
$a0 ← tab
et
$a1 ← n
Les compilateurs effectuent de puissantes optimisations du code produit.
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
30 / 32
Instructions de saut ? Fonction ? Remarques programmation
Convention ? C & ASM
Langage de haut-niveau : retour sur le passage par valeur/addresse en C
Que se passe-t-il avec les arguments d’une fonction lors de son appel ?
=⇒ Ils sont copiés sur la pile dans le contexte d’exécution !
Remarques sur le C et l’assembleur
I
En C, les arguments d’une fonction sont copiés sur la pile.
I
Ces recopies ont un coup (accès mémoire).
I
Utiliser des pointeurs élimine ces recopies =⇒ utile pour les structures !
I
Le concept de pointeur est un concept bas-niveau !
Olivier Marchetti
CM3 – Assembleur MIPS (suite)
Année 2016-2017
31 / 32
Instructions de saut ? Fonction ? Remarques programmation
Convention ? C & ASM
Rendre à César ce qui est à César
Références bibliographiques utilisées
Organisation et conception des ordinateurs , J. Hennessy & D. Patterson, Dunod.
I I
en.wikipedia.org et diverses ressources...
Images utilisées
I Image du transparent 14 :
Sujet :
Source :
Licence :
I Image du transparent 10 :
homme réfléchissant assis.
openclipart.org.
domaine public.
I Image du transparent 20 : échangeur autoroutier Los Angeles-Pasadena-Santa-Monica (auteur : inconnu).
I Image du transparent 10 :
Sujet :
Auteur :
Licence :
Olivier Marchetti
Sujet :
Source :
Licence :
pouce.
openclipart.org.
domaine public.
I Images du transparent 16 :
Sujet :
Auteur :
Licence :
icônes boı̂tes.
openclipart.org.
domaine public.
icône CPU.
Oliver Scholtz.
GNU/GPU
CM3 – Assembleur MIPS (suite)
Année 2016-2017
32 / 32
Téléchargement