Title: JeanJacques Girardot
1Cours Architecture des Systèmes Informatiques
- Jean-Jacques Girardot
- girardot_at_emse.fr
- http//kiwi.emse.fr/ASI
- Cinquième séance
- Langages de Programmation
2Plan
- Introduction aux langages de programmation
- Compilation et génération de code
- Expressions arithmétiques, boucles,
sous-programmes - Module objet, exécutable
- Allocation des variables
- Statique, automatique, dynamique
- Utilisation de la pile
- Notion de cadre
3Les langages de programmation Une classification
- Assembleurs bien utiliser les ressources de
la machine - Premiers langages compilés FORTRAN
(scientifique), COBOL (gestion) écrire des
applications portables - Langages de programmation structurée ALGOL,
PASCAL programmes aisés à concevoir et
maintenir - Langages à objets C programmation dans le
large - Langages fonctionnels LISP, Caml vers des
programmes plus faciles à prouver - Langages déclaratifs Prolog
- Langages spécialisés SQL (bases de données),
sh, ksh, perl (shell scripts), etc
4Technologies d'implantation
- Langages compilés
- Un outil (compilateur) transforme le programme
source en un programme objet, ou un programme
core image - Le résultat est directement exécutable par la
machine - Exemples C, C, Pascal, FORTRAN, ADA, COBOL,
etc. - Langage interprété
- Un outil (interprète) lit le programme source et
(après transformations diverses) lexécute
directement. - Exemples APL, LISP, Perl, CAML, etc.
- Approches intermédiaires - ex SIM
- Source -gt code machine virtuelle, interprétation
du code
5Étapes de lexécutiondun programme compilé
- Compilation traduction dun langage source vers
un langage d'assemblage ou un langage objet - Assemblage traduction dun programme source en
assembleur vers un langage objet - Édition de liens création dun programme
exécutable, rassemblant des modules objets et les
sous-programmes de bibliothèque nécessaires Ã
lexécution - Exécution chargement en mémoire centrale du
programme exécutable le chargeur lui donne
la main
6Compilateur
- Lit un programme en un langage dit de haut
niveauC, C, Pascal, Fortran, Ada langage
source - Opère en plusieurs phases analyse lexicale,
analyse syntaxique, génération de code - Convertit les instructions du programme en
commandes pour la machine langage machine, dit
langage cible - A une instruction du langage source correspondent
en général plusieurs instructions du langage
cible.
7Traduction
- Comment réalise-t-on sur la machine la
représentation des éléments du langage source ? - Génération du code
- Utilisation et gestion des registres
- Création du code machine
- Représentation des variables
- Cours 5, TP 5
- variables globales statiques, variables locales
automatiques - Sous-programmes
- Représentation
- Appel et retour.
8Module objet
- Résultat dune compilation ou dun assemblage
- Structure de données
- segments de code machine
- valeurs dinitialisation données
- liste des externes et points dentrée
- informations de contrôle / mise au point
- Format dentrée pour léditeur de liens
9Module exécutable
- Résultat dune édition de liens
- Structure de données
- segments de code machine
- valeurs dinitialisation des données
- liste des externes et points dentrée
- les externes sont résolus
- informations de contrôle / mise au point
- Format dentrée du chargeur
- Peut contenir des externes non résolus
- chargement dynamique
10Un langage et son compilateur mcc
- mcc mini C compiler
- Sous-ensemble du langage C
- types de données entiers 16 bits, caractères 8
bits - structures de données scalaires, tableaux et
pointeurs - Compilateur minimal
- pas de pré processeur
- pas d'optimisation du code généré
- fournit de l'assembleur en format source
- Utilisation
- compilation gt assemblage gt simulation
11Compilation - 1
- Expressions arithmétiques int a,b,c / var.
globales / a 2 b 5 c
(a3)(b-1) ld r2,2 mul
r3 st.l r2,_at_a ld r2,r1
ld r2,5 st.l r2,_at_c st.l
r2,_at_b ld.l r2,_at_a add r2,3 ld.l
r3,_at_b _at_a data 0 sub r3,1
_at_b data 0 ld r0,r2 _at_c
data 0
12Compilation - 1 notes
- Intervention nécessaire des registres
- Le compilateur traite chaque instruction de
manière séparée - Le compilateur utilise R2, R3 selon les besoins
- Renommage des variables
- a devient _at_a dans le code assembleur produit
- ceci permet d'utiliser r2, r3 comme noms de
variables - Code produit correct, mais médiocre
- génération indépendante de chaque instruction C
- pas d'optimisation spécifique mise en place
13Compilation - 2
- Expressions logiques int i,j
j ilt10 ld.l r2,_at_i ld
r3,10 cmp r2,r3
jlt _at_1002 ld r2,0
jmp _at_1003_at_1002
ld r2,1_at_1003
st.l r2,_at_j - Génération explicite d'une valeur logique 0 ou
1 - Création d'étiquettes par le compilateur _at_1002
14Compilation - 3
- Boucles int i i0 while (ilt10)
ii1 ld r2,0 ld
r2,1 st.l r2,_at_i _at_1005 _at_1003
jeq.l _at_1002 ld.l r2,_at_i
ld.l r2,_at_i ld r3,10
add r2,1 cmp r2,r3
st.l r2,_at_i jlt _at_1004 jmp.l
_at_1003 ld r2,0 _at_1002 jmp
_at_1005_at_1004 _at_i data 0
15Compilation - 4
- Programme complet main() 23 _at_1001
ld r2,2
add r2,3 halt _at_main
ld r14,0 ld
r15,0 jmp.l _at_1001
start _at_main - Notes
- positionnement des registres R14 et R15
- instruction d'arrêt
16Compilation - 5
- Variables globales initialisation int a5,
b main() b3 _at_1001
ld r2,3 st.l r2,_at_b
halt _at_main
ld r14,0 ld r15,0
jmp.l _at_1001 start _at_main
_at_a data 5 _at_b data 0
17Compilation - 6
- Variables locales initialisation main()
int a5,b b3 _at_1001
ld r2,5 st.l r2,-2(r14)
ld r2,3 st.l
r2,-4(r14) halt _at_main
ld r14,0 ld.l
r15,-4 jmp.l _at_1001 start
_at_main - Utilisation de R14 comme registre de base
18Structure du programme en mémoire
19Compilation - 7Un exemple PGCD de 2 nombres
int x, y, z main() x 7953 y 12291
while (x ! y) if (x gt y) zx xy
yz y y-x out (x)
20Le code assembleur
21Compilation des sous-programmes
- Choix et contraintes
- Passages des paramètres, retour du résultat où,
et comment ? - Possibilités registres, pile
- Choix paramètres dans les registres R2, R3, R4
résultat dans R0 - Représentation des variables locales du
sous-programme - Initialisation des variables ?
- Représentation des variables statiques
- Initialisation ?
- Préservation des registres ?
- Qui doit le faire appelant ou appelé ?
- Choix appelé
22Compilation - 8
- Sous-programmes - Arguments int incr(int
x) return x1 main() incr(3)
_at_1001 ld.l r2,-2(r14) _at_1003 ld r2,3
add r2,1 jsr.l _at_incr
ld r0,r2 ld r2,r0
jmp.l _at_1000 halt _at_1000 pop
r2 _at_main ld r14,0 ld
r15,r14 ld r15,0 pop
r14 jmp.l _at_1003 ret
start _at_main _at_incr push r14
ld r14,r15 push r2 jmp.l
_at_1001
23Compilation - 8 Notes - 1
- Appel du sous-programme paramètre dans R2
- Prologue du sous-programme
- Avant appel
- R23, R140, R150
- Appel empile adresse retour (0x24)
- R150xFFFE
- Exécution du Prologue push r14 ld
r14,r15 push r2 - Après le prologue
- R140xFFFC, R150xFFFA
24Compilation - 8 Notes - 2
- Épilogue du sous-programme
- Avant retour
- R04, R23, R14 0xFFFC , R15 0xFFFA
- Exécution de l'épilogue pop r2 ld
r15,r14 pop r14 - Après l'épilogue
- R04, R23, R140, R150xFFFE
- Retour du sous-programme résultat dans R0
- R04, R23, R140, R150
25Compilation - 8 Notes - 3
- Registre R14 accès aux arguments
- premier argument -2(R14), deuxième -4(R14),
etc - La pile contient
- Adresse de retour
- ici 0x0024
- Sauvegarde registre R14 (registre de base de
l'appelant) - Valeur des paramètres
- ici, un seul, R2
- Sauvegarde des registres modifiés par l'appelé
- aucune sauvegarde nécessaire dans le cas présent
- Variables locales de l'appelé
- aucune dans le cas présent
26Compilation - 9
- Sous-programmes - Variables locales int
sub() int x3 return x1 main()
sub()
_at_1001 ld r2,3 st.l r2,-2(r14)
ld.l r2,-2(r14) add r2,1 ld
r0,r2 jmp.l _at_1000 _at_1000 pop r2
add r15,2 ld r15,r14
pop r14 ret
_at_sub push r14 ld r14,r15
sub r15,2 push r2 jmp.l _at_1001
27Compilation - 9 Notes
- Le sous-programme n'a pas de paramètre, mais une
variable locale il a besoin d'un registre de
travail - Prologue
- Sauvegarde R14 de l'appelant
- Positionne R14 de l'appelé
- Réserve 2 octets pour x
- Sauvegarde R2
- Épilogue
- Opérations inverses
28Compilation - 10
- Sous-programmes - Variables locales statiques
int sub() static int x3 return x1
main() sub()
_at_1001 ld.l r2,_at_1002 add r2,1
ld r0,r2 jmp.l _at_1000 _at_1000 pop
r2 ld r15,r14 pop r14
ret
_at_sub push r14 ld r14,r15
push r2 jmp.l _at_1001 _at_1002 data 3
29Compilation 10 - Notes
- Une variable locale statiques est similaire à une
variable globale - Le compilateur génère un nom unique
- ici, _at_1002 remplace le nom x choisi par
l'utilisateur
30Compilation - 11
- Tableau global int tab10 main()
tab35
_at_1001 ld r2,5 ld
r3,3 sll r3,1 st.l
r2,_at_tab(r3) halt _at_main ld
r14,0 ld r15,0
jmp.l _at_1001 start _at_main _at_tab
bss 20
- Notes
- sll r3,1 permet de passer de l'indice de
l'élément à un déplacement en octets Ã
l'intérieur du tableau - utilisation de l'adressage indexé
31Compilation - 12
- Tableau local main() int tab10
tab35
_at_1001 ld r2,5 ld r3,3
sll r3,1 add r3,r14 st.l
r2,-20(r3) halt _at_main ld
r14,0 ld.l r15,-20 jmp.l
_at_1001 start _at_main
- Notes
- Le tableau est réservé dans la pile
- sll r3,1 permet de passer de l'indice de
l'élément à un déplacement en octets Ã
l'intérieur du tableau - utilisation de l'adressage indexé une
instruction machine supplémentaire est
nécessaire pour accéder à l'élément
32Compilation - 13
- Tableau passé en paramètre int sub(int
tab10) return tab3 int tab10
main() tab35 sub(tab)
_at_1001 ld r2,3 sll r2,1
add.l r2,-2(r14) ld r3,(r2) ld
r0,r3 jmp.l _at_1000 _at_1000 pop r3
pop r2 ld r15,r14 pop
r14 ret _at_sub push r14 ld
r14,r15 push r2 push r3
jmp.l _at_1001 _at_1003 ld r2,5 ld
r3,3 sll r3,1 st.l
r2,_at_tab(r3) la.l r2,_at_tab jsr.l
_at_sub ld r2,r0 halt _at_main ld
r14,0 ld r15,0 jmp.l
_at_1003 start _at_main _at_tab bss 20