Professional Documents
Culture Documents
• Introduction
• Architecture de base d’une machine
• La Mémoire Centrale
• UAL ( unité arithmétique et logique )
• UC ( unité de contrôle ou de commande )
• Jeu d’instructions , Format et codage d’une instruction
• Modes d’adressage
• Étapes d’exécution d’un instruction
4
+
Plan
A Thinking Machine
La Machine Savante
Le programme EG Successor
Des régles simples :
Le programme EG Successor
If read 1, write 0, go right, repeat.
1 1 1 1 0 1
+ A Thinking Machine
10
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 1 1 1 0 1
+ A Thinking Machine
11
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 1 1 0 1
+ A Thinking Machine
12
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 0 1 0 1
+ A Thinking Machine
13
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 0 0 0 1
+ A Thinking Machine
14
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 0 0 1 1
+ A Thinking Machine
15
Le programme EG Successor
Donc le succeseur de 111101 est 000011 qui le complement de
48
Le programme EG Successor
If read 1, write 0, go right, repeat.
1 1 1 1 1 1 1
+ A Thinking Machine
17
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 1 1 1 1 1 1
+ A Thinking Machine
18
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 1 1 1 1 1
+ A Thinking Machine
19
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 0 1 1 1 1
+ A Thinking Machine
20
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 0 0 1 1 1
+ A Thinking Machine
21
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 0 0 0 1 1
+ A Thinking Machine
22
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 0 0 0 0 1
+ A Thinking Machine
23
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 0 0 0 0 0
+ A Thinking Machine
24
Le programme EG Successor
If read 1, write 0, go right, repeat.
0 0 0 0 0 0 0 1
+ TM : Instructions 25
0. if read , go right (dummy move), ACCEPT
TM : Notation
Exemple
Lis la régle 3
S’écrit sous la forme:
$xxx1q3010
if read $, go right, goto 4 // look for start of tape
else, go left, repeat
+ 1. Introduction
n Pour exécuter un programme par une machine, on passe par les étapes
suivantes :
28
+
!
29
Architecture matérielle d’une machine
+ ( architecture de Von Neumann )
entrées
UC Mémoire
Processeur Centrale
sorties
30
+
La mémoire centrale
31
+
Une adresse
• La mémoire centrale peut être vu comme
un large vecteur ( tableau ) de mots ou 0001100 0000
octets.
• Un mot mémoire stocke une information
0011100 0001
sur n bits. 0111100 0002
• Chaque mot possède sa propre adresse. 0001100 …….
• La mémoire peut contenir des 0001100 …….
programmes et les données utilisées par les
……..
programmes.
Contenu d’une case
(un mot)mémoire
FFFF
32
+Structure d’un programme en MC
1000000
}
1111111 Partie
0000000
11110000 données
Addition 11000001 ( variables )
Soustraction 11100001
11000001
11100001
11100001 Partie instructions
………….
……….
+ L’Unité Centrale ( UC)
34
Architecture matérielle d’une
+ machine Von Neumann
UC
+ L’UAL
n L’unité arithmétique et logique réalise une opération élémentaire
(addition, ,soustraction, multiplication, . . .).
n L’UAL regroupe les circuits qui assurent les fonctions logiques et
arithmétiques de bases ( ET,OU,ADD,SUS,…..).
36
+
n L’UAL comporte aussi un registre d’état : Ce registre nous indique
l’état du déroulement de l’opération .
n Ce registre est composé d’un ensemble de bits. Ces bits s’appels
indicateurs (drapeaux ou flags).
n Ces indicateurs sont mis à jours ( modifiés )après la fin de l’exécution
d’une opération dans l’UAL.
37
+
Unité de contrôle
38
+
39
+
Schéma d’une UC
40
+
Remarque
n Ces registres sont plus rapide que la mémoire centrale , mais
le nombre de ces registre est limité.
41
+
Une machine avec des registres de
travail
registres
42
+
Jeu d’instructions
43
+ Codage d’une instruction
n Les instructions et leurs opérandes ( données ) sont stocké dans la mémoire.
N bits K bits
• Le format d’une instruction peut ne pas être le même pour toutes les instructions.
• Le champs opérande peut être découpé à sont tours en plusieurs champs
44
+ Machine à 3 adresses
n Dans ce type de machine pour chaque instruction il faut préciser :
n l’adresse du premier opérande
n du deuxième opérande
n et l’emplacement du résultat
Exemple :
ADD A,B,C ( CßB+C )
45
+ Machine à 2 adresses
n Dans de type de machine pour chaque instruction il faut préciser :
n l’adresse du premier opérande
n du deuxième opérande ,
Exemple :
ADD A,B ( BßA +B )
46
+
Machine à 1 adresses
Exemple :
ADD A ( ACCß(ACC) + A )
47
+ Mode d’adressage
n La champs opérande contient la donnée ou la référence ( adresse ) à
la donnée.
48
+
Adressage immédiat
Exemple :
ADD 150 ADD 150
49
+
Adressage direct
n Le champs opérande de l’instruction contient l’adresse de l’opérande
( emplacement en mémoire )
Exemple :
On suppose que l’accumulateur
continent la valeur 20 .
ADD 150
50
+ Adressage indirect
n La champs adresse contient l’adresse de l’adresse de
l’opérande.
50
ADD 150
30
200
Remarque : si ADR ne contient pas une valeur
immédiate alors
Adresse opérande = (ADR )+ (X) 52
+
Adressage relatif
n L’adresse effectif de l’opérande est relatif a une zone mémoire.
n L’dresse de cette zone se trouve dans un registre spécial ( registre de base ).
100
BR 150
ADD
250
53
+
Cycle d’exécution d’une instruction
54
+n Exemple1 : déroulement de l’instruction d’addition en mode immédiat
ACCß(ACC)+ Valeur
n CO ß (CO )+ 1
55
+ ACCß(ACC)+
Exemple 2 : déroulement de l’instruction d’addition en mode direct
n
(ADR)
56
+n ACCß(ACC)+
Exemple 3 : Déroulement de l’instruction d’addition en mode indirect
((ADR))
57
+
CPU Memory
Addresses
Registers Object Code
E Data Program Data
I OS Data
P Condition Instructions
Codes
Stack
n Programmer-Visible State
n EIP (Program Counter)
n Address of next instruction
n Register File
n Heavily used program data n Memory
n Condition Codes n Byte-addressable array
n Storestatus information about most n Code, user data, (most) OS data
recent arithmetic operation n Includes stack used to support
n Used for conditional branching procedures
+Comment créer un programme
« exécutable » ?
0) Ecriture des fichiers sources *.c
1) Compilation : cc -c prog_principal.c (idem pour les sous programmes)
2) Liens : cc prog_principal.o sous_prog1.o sous_prog2.o -o prog_executable
3) Reste à lancer prog_executable …
1) Compilation
[10 110 001 101 011 . 111 100 110] 2 = [26153.746] 8 = [26153.746] 8 = [2C6B.F3]16
+
Conversion Décimale à RADIX (2, 8, 16)
[Ne.Nf]10 = [?]R
…, etc.
+Complément à ‘2’ et Complément à ‘1’
-8 est représenté
+ L’ORDINATEUR représente les nombres en nombre limité de bits: 8, 16, 32, 64
bits
+2 0000 0010
Nombres positifs
+1 0000 0001 [ - 128 à + 127 ]
0 0000 0000
-1 1111 1111
-2 1111 1110
Code ASCII
+
Types de variables manipulées en C
En général un nombre dans un système à base R (Radix) est noté comme suit:
Partie Entière Partie Fractionnaire
Soit:
N = dm.Rm + dm-1.Rm-1 + … +d1.R + d0 + d-1.R-1 +… d-n.R-n
+
Le programme principal
n #include
<math.h> : insère les interfaces des
fonctions mathématiques comme par exemple
fabs() qui évalue la valeur absolue d ’un réel
a = 3;
Soustraction - c = a - 2; // c = 1
a = 3;
Multiplication * b = 11;
c = a + b; // c = 33
a = 75;
Division / b = 3;
c = a / b; // c = 25
Modulo % a = 75;
Reste de la division diz = a / 10; // diz = 7
unite = a % 10 // unite = 5 c ’est à dire le reste
+
Qu’est-ce qu’un bloc d ’instructions ?
n Le
prototype de ces fonctions est dans
<stdio.h>
n printf permet d ’afficher du texte à l ’écran
n scanf permet d ’entrer du texte au clavier
n fprintf
et fscanf permettent de lire et d ’écrire
dans des fichiers
Le programme de résolution de l’équation
d’advection linéaire scalaire donne de
nombreux exemples d’usage de ces fonctions
+
printf, scanf (suite)
\n : fin de ligne
\t : tabulation horizontale
\a : sonnerie
+ printf, scanf : exemples
#include<stdio.h>
int i;
printf(" i = %d \n",i); /* Imprime i = valeur de i et va à la ligne */
n if
(expression_test)
bloc d ’instructions 1
else
bloc d ’instructions 2
Si expression_test est vraie on exécute le bloc
d ’instructions 1 sinon on exécute le bloc 2.
+
Instruction conditionnelle IF…. ELSE
Si la condition est vrai
Fausse • faire l ’action 1
Condition if( a > b ) c = c - a;
? • sinon faire action 2 else c = c- b;
if( a > b )
Vrai { c = c - a;
Action 1 Action 2 d = c - a;
}
else { c = c - b;
d = c - b;
}
if( a > b )
if( condition ) action1; { c = c - a;
d = c - a;
else action2;
}
• Enchaînement de if :
if (expression_test1)
bloc_d_instructions_1
else if (expression_test2)
bloc_d_instructions_2
else if (expression_test3)
bloc_d_instructions_3
...
else
bloc_d_instructions_final
+
Expressions évaluées dans les tests
• if (a == b) : a égal à b
• if (a != b) : a différent de b
• if (a > b) : a supérieur à b
• ...
Instruction conditionnelle SWITCH … CASE
+
switch ( expression )
Remplace une suite de IF .. ELSE
{
while (condition)
x = 0;
Cette boucle est identique à une boucle FOR
{ while ( x < 5 )
action;
{
Condition …;
? action;
Sortie de la
}
boucle x++;
Action }
x = 10;
Boucle WHILE
while ( x < 5 )
while ( 1 ) {
{ action;
x++;
action;
}
……; while ( bouton == 0 )
} {
action;
}
Boucle DO … WHILE
+
Faire... tant que condition vraie
Sortie de la
boucle
Différent != if( a != b )
Simplification
Opérateurs logique de test if( a ) …
else …
if( (a > b) && ( b > 0) )
ET &&
OU || if( (a > b) || ( b > 0) ) ce test est :
• vrai si a > 0
NON ! if( !( a == b) ) • faux si a = 0
+ Opérateurs
a = 55;
Incrément ++ a++; // a = 56
a = 20;
Décrément -- a--; // a = 19
Séparateur ; a = 55; b = a + 1;
/* Schema decentre */
for (i = 0 ; i <= imax-1 ; i++)
{
fnum[i] = 0.5*(fphy[i] + fphy[i+1]) - 0.5*fabs(a)*(rho[i+1]-
rho[i]);
}
} /* Fin de bloc */
+ Interface d ’une fonction
n NB : Si une fonction f1 fait appel à une fonction f2, f1 doit avoir
connaissance de l’interface de f2. Ceci se fait en rappelant l’interface
de f2 dans le fichier contenant f1 (voir le code d ’advection linéaire)
+ Les fonctions void buzzer (void)
{
prog ….
…..
}
Initialisation
des ports
void init_port (void)
Led1 éteinte {
….
…..
}
BP
activé ?
void main(void)
{ int c;
a = 10.0;
b = 5.0;
c = somme( ); /* Appel au sous programme externe */
}
void main(void)
{ int a,b,c; /* Variables locales a, b et c */
a = 10.0;
b = 5.0;
c = somme( a,b); /* Appel au sous programme externe */
}
• Exemple :
struct individu {
char nom[30];
char prenom[50];
int age; }
• Utilisation :
struct individu eleve,professeur,directeur;
eleve.nom = « einstein »;
eleve.prenom = « albert »;
eleve.age = 25;
Pointeurs
&
Allocation de mémoire
+
Plan
n Rappel
n Lesvariables en mémoire
n Adressage des variables
n Notion de pointeur
n Pointeurs & Tableaux
n Allocation dynamique de la mémoire
+ Rappel : Les variables en mémoire
n Une variable est destinée à contenir une valeur du type avec lequel
elle est déclarée.
L’opérateur &
n Définition : "Un pointeur est une variable spéciale qui peut contenir
l'adresse d'une autre variable. "
n Chaque pointeur est limité à un type de données.
px = &x;
px pointe sur x
+
Notion de pointeur
n L’opérateur * permet d’accéder au contenu de la variable pointée :
20
+
Notion de pointeur
Après les instructions: <type> a;
<type> *p;
p = &a;
p pointe sur a
p désigne &a (adresse de a)
è Allocation dynamique
n Il
est conseillé d'affecter la valeur zéro NULL au
pointeur immédiatement après avoir libéré le bloc de
mémoire qui y était attaché.
p=(int*)malloc(nbr*sizeof(int));
for(i=0; i<10; i++)
for(i=0; i<nbr; i++)
tab[i]=i; *(p+i)=i;
for(i=0; i<10; i++) for(i=0; i<nbr; i++)
printf("%d\n",*(p+i));
printf("%d\n",tab[i]);
free(p);
}
}
+
Double Pointeur **
Assembleur
+Du fichier texte C au Code Objet
n Codage en C p1.c p2.c!
n Compilation avec la commande : gcc -O p1.c p2.c -o p!
n Optimisation du code (-O)
n Fichier binaire executable p
gcc -O -S code.c
On obtient : code.s
+ Code
Code pour sum
0x401040 <sum>:
0x55
0x89 • Total of 13
0xe5 bytes"
0x8b • Each
0x45 instruction 1,
0x0c 2, or 3 bytes"
0x03 • Starts at
0x45 address
0x08 0x401040
0x89
0xec
0x5d
0xc3
+ Instruction Machine
n C
int t = x+y; n Addition de 2 entiers
n Assembleur
n Addition 2 4-byte integers
addl 8(%ebp),%eax
words en GCC
n “Long”
données %edx
%ecx
movl Source,Dest:
%ebx
n Move 4-byte (“long”) word
%esi
%edi
n Types d’opérands
n Immediate: Constant integer data %esp
n Comme en C mais avec le préfixe ‘$’ %ebp
n $0x400, $-533
n Coder sur 1, 2, ou 4 bytes
n Registres : 8 integer
n %esp et %ebp utilisation spéciale
movl -4(%ebp),%ebx
movl %ebp,%esp Fin
popl %ebp
ret
+ Comprendre le Swap
void swap(int *xp, int *yp) •
{ • Stack
int t0 = *xp; •
Offset
int t1 = *yp;
*xp = t1; 12 yp
*yp = t0; 8 xp
}
4 Rtn adr
0 Old %ebp %ebp
-4 Old %ebx
Register "Variable"
%ecx yp movl 12(%ebp),%ecx # ecx = yp
%edx xp movl 8(%ebp),%edx # edx = xp
%eax t1 movl (%ecx),%eax # eax = *yp (t1)
%ebx t0 movl (%edx),%ebx # ebx = *xp (t0)
movl %eax,(%edx) # *xp = eax
movl %ebx,(%ecx) # *yp = ebx
Address
+ Comprendre le Swap 123 0x124
456 0x120
0x11c
%eax 0x118
%edx Offset
0x114
%ecx yp 12 0x120 0x110
xp 8 0x124 0x10c
%ebx
4 Rtn adr 0x108
%esi
%ebp 0 0x104
%edi -4
0x100
%esp
movl 12(%ebp),%ecx # ecx = yp
%ebp 0x104 movl 8(%ebp),%edx # edx = xp
movl (%ecx),%eax # eax = *yp (t1)
movl (%edx),%ebx # ebx = *xp (t0)
movl %eax,(%edx) # *xp = eax
movl %ebx,(%ecx) # *yp = ebx
Address
+Comprendre le Swap 123 0x124
456 0x120
0x11c
%eax 0x118
%edx Offset
0x114
%ecx 0x120 yp 12 0x120 0x110
xp 8 0x124 0x10c
%ebx
4 Rtn adr 0x108
%esi
%ebp 0 0x104
%edi -4
0x100
%esp
movl 12(%ebp),%ecx # ecx = yp
%ebp 0x104 movl 8(%ebp),%edx # edx = xp
movl (%ecx),%eax # eax = *yp (t1)
movl (%edx),%ebx # ebx = *xp (t0)
movl %eax,(%edx) # *xp = eax
movl %ebx,(%ecx) # *yp = ebx
Address
+ Comprendre Swap 123 0x124
456 0x120
0x11c
%eax 0x118
%edx 0x124 Offset
0x114
%ecx 0x120 yp 12 0x120 0x110
xp 8 0x124 0x10c
%ebx
4 Rtn adr 0x108
%esi
%ebp 0 0x104
%edi -4
0x100
%esp
movl 12(%ebp),%ecx # ecx = yp
%ebp 0x104 movl 8(%ebp),%edx # edx = xp
movl (%ecx),%eax # eax = *yp (t1)
movl (%edx),%ebx # ebx = *xp (t0)
movl %eax,(%edx) # *xp = eax
movl %ebx,(%ecx) # *yp = ebx
Address
+Comprendre le Swap 123 0x124
456 0x120
0x11c
%eax 456 0x118
%edx 0x124 Offset
0x114
%ecx 0x120 yp 12 0x120 0x110
xp 8 0x124 0x10c
%ebx
4 Rtn adr 0x108
%esi
%ebp 0 0x104
%edi -4
0x100
%esp
movl 12(%ebp),%ecx # ecx = yp
%ebp 0x104 movl 8(%ebp),%edx # edx = xp
movl (%ecx),%eax # eax = *yp (t1)
movl (%edx),%ebx # ebx = *xp (t0)
movl %eax,(%edx) # *xp = eax
movl %ebx,(%ecx) # *yp = ebx
Address
+Comprendre le Swap 123 0x124
456 0x120
0x11c
%eax 456 0x118
%edx 0x124 Offset
0x114
%ecx 0x120 yp 12 0x120 0x110
xp 8 0x124 0x10c
%ebx 123
4 Rtn adr 0x108
%esi
%ebp 0 0x104
%edi -4
0x100
%esp
movl 12(%ebp),%ecx # ecx = yp
%ebp 0x104 movl 8(%ebp),%edx # edx = xp
movl (%ecx),%eax # eax = *yp (t1)
movl (%edx),%ebx # ebx = *xp (t0)
movl %eax,(%edx) # *xp = eax
movl %ebx,(%ecx) # *yp = ebx
Address
+Comprendre le Swap 456 0x124
456 0x120
0x11c
%eax 456 0x118
%edx 0x124 Offset
0x114
%ecx 0x120 yp 12 0x120 0x110
xp 8 0x124 0x10c
%ebx 123
4 Rtn adr 0x108
%esi
%ebp 0 0x104
%edi -4
0x100
%esp
movl 12(%ebp),%ecx # ecx = yp
%ebp 0x104 movl 8(%ebp),%edx # edx = xp
movl (%ecx),%eax # eax = *yp (t1)
movl (%edx),%ebx # ebx = *xp (t0)
movl %eax,(%edx) # *xp = eax
movl %ebx,(%ecx) # *yp = ebx
Address
+ Comprendre le Swap 456 0x124
123 0x120
0x11c
%eax 456 0x118
%edx 0x124 Offset
0x114
%ecx 0x120 yp 12 0x120 0x110
xp 8 0x124 0x10c
%ebx 123
4 Rtn adr 0x108
%esi
%ebp 0 0x104
%edi -4
0x100
%esp
movl 12(%ebp),%ecx # ecx = yp
%ebp 0x104 movl 8(%ebp),%edx # edx = xp
movl (%ecx),%eax # eax = *yp (t1)
movl (%edx),%ebx # ebx = *xp (t0)
movl %eax,(%edx) # *xp = eax
movl %ebx,(%ecx) # *yp = ebx
+ Adressage indexé
n La forme générale
n D(Rb,Ri,S) Mem[Reg[Rb]
+S*Reg[Ri]+ D]
n D: Constant “deplacement” 1, 2, or 4 bytes
n Rb: Base register: Any of 8 integer registers
n Ri: Index register: Any, exception pour %esp
n Sinon%ebp,
n S: Scale: 1, 2, 4, or 8
n (Rb,Ri) Mem[Reg[Rb]+Reg[Ri]]
%ecx 0x100
n Utilisation
n Calcul de l’adresses simplement
n Ex : translation de p = &x[i];
n Calcul de l’adresse arithmétique x + k*y
n k = 1, 2, 4, or 8.
+ Opérations Arithmétiques
Format Actions
n Instruction avec 2 opérands
addl Src,Dest Dest = Dest + Src
subl Src,Dest Dest = Dest - Src
imull Src,Dest Dest = Dest * Src
sall k,Dest Dest = Dest << k shll
sarl k,Dest Dest = Dest >> k Arithmetique
shrl k,Dest Dest = Dest >> k Logique
Format Opération
n Instructions avec un seul opérand
incl Dest Dest = Dest + 1
decl Dest Dest = Dest - 1
negl Dest Dest = -Dest
notl Dest Dest = ~Dest
+Utilisation de leal pour des
opérations arithmétiques
arith:
pushl %ebp
int arith movl %esp,%ebp
(int x, int y, int z) Initialisation
{ movl 8(%ebp),%eax
int t1 = x+y; movl 12(%ebp),%edx
int t2 = z+t1; leal (%edx,%eax),%ecx
int t3 = x+4; leal (%edx,%edx,2),%edx
int t4 = y * 48; sall $4,%edx Corp
int t5 = t3 + t4; addl 16(%ebp),%ecx
int rval = t2 * t5; leal 4(%edx,%eax),%eax
return rval; imull %ecx,%eax
}
movl %ebp,%esp
popl %ebp Fin
ret
+ Comprendre arith
int arith •
(int x, int y, int z) • Stack
{ Offset •
int t1 = x+y;
int t2 = z+t1; 16 z
int t3 = x+4; 12 y
int t4 = y * 48;
int t5 = t3 + t4; 8 x
int rval = t2 * t5; 4 Rtn adr
return rval; %ebp
0 Old %ebp
}
Modèle de Machine
Données Control
C
1) loops
mem proc 1) char 2) conditionals
2) int, float 3) switch
3) double 4) Proc. call
4) struct, array 5) Proc. return
Assembleur 5) pointer
n Caractéristiques
n Traduction des instruction dans un format plus régulier
n Beaucoup d’instruction mais très simple
n Pipeline de
n 12–18 cycles
+ PentiumPro : Schéma Block
+ Quel Assembleur?
Intel/Microsoft Format GAS/Gnu Format
lea eax,[ecx+ecx*2] leal (%ecx,%ecx,2),%eax
sub esp,8 subl $8,%esp
cmp dword ptr [ebp-8],0 cmpl $0,-8(%ebp)
mov eax,dword ptr [eax*4+100h] movl $0x100(,%eax,4),%eax