Académique Documents
Professionnel Documents
Culture Documents
Leçon 4 : structure des ordinateurs
Objectif du cours
Composants de l’architecture
• Processeur (CPU
• Unité arithmétique et logiqu
• Opérateurs matériels mettant en œuvre
les opérations arithmétiques (+, -, …)
et logiques (&, |, ^, …
• Unité de command
• Met en œuvre le cycle fetch/decode/execute des instructions
depuis la mémoire
5
Composants de l’architecture
• Mémoir
• Stocke à la fois les données et les instruction
• Organisée en octets d’adresses consécutive
• 2k octets : adresse sur au moins k bit
• Typiquement, k = 32 ou 64 bit
• Un processeur qui utilise des adresses sur k bits peut adresser au
plus 2k octets de mémoire physiqu
• 32 bits : 232 = 4 × 210 × 210 × 210 = 4 Giga-octets de mémoire
max. Combien sur votre PC personnel
• 64 bits : 264 = 16 × (210)6 = 16 Exa-octets (milliards de milliards)
Instructions et registres
fi
r
Architecture moderne
Technologies mémoire
10
11
Technologies de DRAM
SRAM vs DRAM
Densité 😢 😀 1995 15 ns 70 ns
Consommation 2000 3 ns 60 ns
😭 😕
d’énergie
2005 2 ns 50 ns
Prix par Mo 😭 😀
2010 1.5 ns 40 ns
15
Mémoire cache
t
e
16
Localités mémoire
Hiérarchie mémoire
20
fi
21
En réalité …
22
Conclusion intermédiaire
23
Étude de cas :
jeu d’instruction IA 32
Objectifs
25
Registres
EIP
Types de données
Type Taille (bytes) Suf xe assembleur
char 1 b
short 2 w
int 4 l
long int 4 l
void * 4 l
Instruction mov
28
Modes d’adressage
• Comment spéci er les argument
• Premier mode : registre
• Nom du registre pré xé par %
• %eax, %ebx, etc
fi
fi
fi
e
29
0x04
FF
0x00 4
movl 0x04, %eax ; place la valeur 0x00 (qui se trouve à l'adresse 0x04) dans %eax
movl $1252, %ecx ; initialisation de %ecx à 1252
movl %ecx, 0x08 ; remplace 0xFF par le contenu de %ecx (1252) à l'adresse 0x08
fi
e
30
0x00 4
fi
r
31
•
0x10 4
Permet d’accéder à une adresse + ou - une
valeur donné 0x0C 10
32
Instructions arithmétiques et
logiques
• Comme pour mov, une variante par taille de
données à manipuler (b, w ou l
33
34
Illustration (1)
Adresse Variable Valeur
0x0C c 0x00
0x08 b 0xFF
0x04 a 0x2
0x00 • 0x1
35
Illustration (2)
36
37
Instructions de comparaison
>
38
Illustration
cmpl $1, h ; comparaison
setg %al ; %al est le byte de poids faible de %eax
movzbl %al, %ecx ; copie le byte dans %ecx
movl %ecx, r ; sauvegarde du résultat dans r
movl j, %ecx
cmpl h, %ecx ; comparaison entre j et h
sete %al
movzbl %al, %ecx
movl %ecx, r
39
Instructions de saut
40
goto en C
int v=0
for(int i=0;i<SIZE;i++
for(int j=0;j<SIZE;j++)
if(m[i][j]>MVAL)
v=m[i][j]
goto suite
41
• Saut conditionnels
• je : saut si égal (teste le drapeau ZF) (inverse : jne
• js : saut si négatif (teste le drapeau SF) (inverse : jns
• jg : saut si strictement supérieur (teste les drapeaux SF et ZF
et prend en compte un over ow éventuel) (inverse : jl
• jge : saut si supérieur ou égal (teste le drapeaux SF et prend
en compte un over ow éventuel) (inverse : jle)
fl
)
42
Exemple : conditionnelles
43
.LBB3_1
debut cmpl $0, j ; j<=0
while(j>0 if(j<=0) { goto fin; jle .LBB3_3 ; jump si j<=0
j=j-3 movl j, %eax
j=j-3 goto debut subl $3, %eax
} fin movl %eax, j ; j=j-3
jmp .LBB3_1
.LBB3_3:
44
45
Manipulation de la pile
46
47
Fonctions et procédures
•
int main(int argc, char *argv[])
Instruction call combine opérations 1 et init_g()
•
increase()
L’adresse de continuation est placée sur la pil return(EXIT_SUCCESS)
•
}
Instruction ret met en oeuvre
• call et ret modi ent la pile et donc %esp
fi
{
48
Illustration
increase: ; étiquette de la première instruction
movl g, %eax
int g=0
addl h, %eax
int h=2
movl %eax, g
ret ; retour à l'endroit qui suit l'appel
void increase()
init_g: ; étiquette de la première instruction
g=g+h
movl $1252, g
ret ; retour à l'endroit qui suit l'appel
main
void init_g()
(...)
g=1252
calll init_g ; appel à la procédure init_g
A_init_g: calll increase ; appel à la procédure increase
A_increase: movl $0, %eax
int main(int argc, char *argv[])
addl $12, %esp
init_g()
ret ; fin de la fonction main
increase()
g: ; étiquette, variable globale g
return(EXIT_SUCCESS)
.long 0 ; initialisée à 0
}
h: ; étiquette, variable globale g
.long 2 ; initialisée à 2
49
Illustration (2)
int g=0
int h=2
q
void q()
movl $1252, g
g=1252
ret ; retour à l'appelant
p
subl $12, %esp ; réservation d'espace sur pile
void p()
calll q ; appel à la procédure q
q()
movl g, %eax
g=g+h
addl h, %eax
movl %eax, g
addl $12, %esp ; libération espace réservé sur pile
int main(int argc, char *argv[])
ret ; retour à l'appelant
p()
return(EXIT_SUCCESS)
}
fi
50
fi
!
fi
s
51
init
Exemple
subl $8, %esp ; réservation d'espace sur la
pile
movl 16(%esp), %eax ; récupération du second
argument
movl 12(%esp), %ecx ; récupération du premier
argument
movl %ecx, 4(%esp) ; sauvegarde sur la pile
movl %eax, (%esp) ; sauvegarde sur la pile
movl 4(%esp), %eax ; chargement de i
movl %eax, g ; g=i
movl (%esp), %eax ; chargement de j
int g=0
movl %eax, h ; h=j
int h=2
addl $8, %esp ; libération de l'espace réservé
void init(int i, int j)
ret
g=i
main
h=j
pushl %esi
subl $40, %esp
movl 52(%esp), %eax
int main(int argc, char *argv[])
movl 48(%esp), %ecx
init(1252,1)
movl $1252, %edx
return(EXIT_SUCCESS)
movl $1, %esi
}
movl $0, 36(%esp
movl %ecx, 32(%esp
movl %eax, 24(%esp
movl $1252, (%esp) ; premier argument sur la pile
movl $1, 4(%esp) ; deuxième argument sur la pile
movl %esi, 20(%esp
movl %edx, 16(%esp
calll init ; appel à init
movl $0, %eax
addl $40, %esp
popl %esi
ret
52
53
init
Exemple
movl $1252, %eax
ret
sum
subl $8, %esp ; réservation d'espace sur la pile
movl 16(%esp), %eax ; récupération du second argument
movl 12(%esp), %ecx ; récupération du premier argument
movl %ecx, 4(%esp
movl %eax, (%esp
int g=0 movl 4(%esp), %eax ; %eax=a
int h=2 addl (%esp), %eax ; %eax=a+b
addl $8, %esp ; libération de l'espace réservé
int init() ret
return 1252 main
subl $28, %esp
movl 36(%esp), %eax
int sum(int a, int b) movl 32(%esp), %ecx
return a+b movl $0, 24(%esp
movl %ecx, 20(%esp) ; sauvegarde sur la pile
movl %eax, 16(%esp) ; sauvegarde sur la pile
int main(int argc, char *argv[]) calll init
g=init() movl $1, %ecx
h=sum(1,2) movl $2, %edx
return(EXIT_SUCCESS) movl %eax, g
} movl $1, (%esp) ; premier argument
movl $2, 4(%esp) ; second argument
movl %ecx, 12(%esp) ; sauvegarde sur la pile
movl %edx, 8(%esp) ; sauvegarde sur la pile
calll sum
movl $0, %ecx
movl %eax, h
movl %ecx, %eax
addl $28, %esp
ret
54
Fonctions récursives
sumn
subl $28, %esp ; réservation d'espace sur la pile
movl 32(%esp), %eax ; récupération argument
movl %eax, 20(%esp) ; sauvegarde sur pile
cmpl $1, 20(%esp
jg .LBB1_2 ; jump si n>1
movl 20(%esp), %eax ; récupération n
movl %eax, 24(%esp
jmp .LBB1_3
.LBB1_2
movl 20(%esp), %eax
movl 20(%esp), %ecx
subl $1, %ecx ; %ecx=n-1
movl %ecx, (%esp) ; argument sur pile
movl %eax, 16(%esp
recursion
calll sumn
movl 16(%esp), %ecx ; récupération de n
addl %ecx, %eax ; %eax=%eax+n
movl %eax, 24(%esp
.LBB1_3
movl 24(%esp), %eax
addl $28, %esp ; libération de l'espace réservé sur la pile
ret
55
Conclusion
Conclusion