Organisation des Ordinateurs

publicité
Organisation des Ordinateurs
Bernard Boigelot
E-mail
URL
:
:
[email protected]
http://www.montefiore.ulg.ac.be/~boigelot/
http://www.montefiore.ulg.ac.be/~boigelot/cours/org/
1
Chapitre 1
Les circuits digitaux
2
Les ordinateurs
Définition: Un ordinateur est une machine capable de
• résoudre des problèmes et de
• traiter des données
en effectuant des opérations préétablies.
But du cours: Etudier le fonctionnement interne des ordinateurs.
3
L’information (I)
Question: Quand peut-on dire qu’un objet A possède de l’information ?
A
B
42
???
Réponse: Lorsque
• A connaı̂t une donnée (p.ex., la valeur d’une variable) et
• cette donnée peut être communiquée à un autre objet B qui ne la
connaı̂t pas.
4
L’information (II)
Remarque: Communiquer une donnée de A à B s’effectue via des signaux
transmis via un canal de communication.
Définition:
L’information est une donnée pouvant être transmise par un signal
(ou par une combinaison de signaux).
Exemple: Compact Disc.
5
Les signaux continus
Les signaux véhiculant de l’information peuvent prendre plusieurs formes.
m
ax
m
in
Définition: Un signal continu est un signal qui peut prendre un nombre
infini de valeurs dans un intervalle donné.
Inconvénient: L’information n’est pas transmise fiablement, car la valeur
de chaque signal est entachée d’imprécisions.
6
Le bruit
L’ensemble des imprécisions affectant un signal peut être regroupé en un
signal de bruit.
Lorsque A transmet un signal à B, on a donc:
signal reçu par B = signal émis par A + signal de bruit
Remarques:
• Le bruit ne peut jamais être entièrement éliminé d’un signal continu.
• Le bruit limite la quantité de données pouvant être transmises par un
signal
7
Les signaux discrets
Définition: Un signal discret est un signal possédant un nombre fini de
valeurs nominales.
Avantage: La transmission fiable de données est possible malgré la
présence de bruit.
En effet, si l’amplitude du signal de bruit est suffisamment petite, les
valeurs transmises peuvent toujours être correctement identifiées à leur
réception.
Dans les ordinateurs, l’information est transmise, traitée et mémorisée au
moyen de signaux discrets.
8
Exemple de signaux discrets
Tonalités de signalisation d’un téléphone à touches:
1209 1336 1477
Hz Hz Hz
687
Hz
1
2
3
770
Hz
4
5
6
852
Hz
7
8
9
941
Hz
∗
0
#
9
La quantité d’information (I)
Question: Comment peut-on quantifier la quantité d’information
transportée par un signal discret ?
Desiderata:
• Plus la probabilité de recevoir une valeur est faible, plus la quantité
d’information est élevée.
inf
> inf
• Lorsque l’on combine des signaux indépendants, l’information doit
s’additionner.
inf
=
3 × inf
10
La quantité d’information (II)
Définition: La quantité d’information transmise par une valeur discrète
reconnaissable de façon fiable est égale à
log2 1p ,
où p dénote la probabilité que cette valeur soit reçue.
Cette quantité d’information s’exprime en bits (binary digits).
Par conséquent, la quantité d’information contenue dans un signal
pouvant prendre N valeurs équiprobables (reconnaissables de façon fiable)
vaut
log2 N .
Un bit représente donc la quantité d’information permettant de distinguer
fiablement deux valeurs équiprobables.
11
Exemples
On transmet une lettre de l’alphabet au moyen d’un signal de tension:
A = 0 V, B = 0,04 V, C = 0,08 V, . . . , Y = 0,96 V, Z = 1 V.
Situation 1: Les 26 valeurs peuvent être fiablement reconnues.
• Si les probabilités de recevoir un E et un Z sont (resp.) égales à 0,18
et 0,0007, la quantité d’information transmise par les signaux
correspondants vaut (resp.)
1
' 2,47 bits
log2
0,18
et
log2
1
' 10,48 bits.
0,0007
12
• Si les 26 lettres ont la même probabilité d’être reçues, la quantité
d’information contenue dans un signal vaut
log2 26 ' 4,7 bits.
Situation 2: On ne peut distinguer que les tensions supérieures ou
inférieures à 0,5 V.
Si les 2 valeurs sont équiprobables, la quantité d’information véhiculée par
un signal vaut
log2 2 = 1 bit.
13
L’abstraction digitale
Dans les circuits d’un ordinateur, l’information est représentée par une
grandeur physique discrète: la tension électrique (le plus souvent), mais
parfois aussi le courant, la fréquence, l’intensité lumineuse, . . . .
Pour décrire les circuits de l’ordinateur, il est plus commode de faire
référence aux valeurs représentées par les signaux plutôt qu’aux grandeurs
physiques utilisées.
La correspondance entre un signal discret et la valeur représentée par
celui-ci porte le nom d’abstraction digitale.
L’abstraction digitale va nous permettre de décrire des circuits
élémentaires et de les combiner de manière à obtenir des circuits
complexes, en faisant abstraction des aspects électriques et électroniques
du problème.
14
L’algèbre booléenne
Pour des raisons de simplicité et d’immunité maximale au bruit, les
signaux discrets utilisés dans les ordinateurs sont binaires.
Rappel: La quantité d’information contenue dans un signal binaire
équiprobable vaut
log2 2 = 1 bit.
L’algèbre booléenne est la théorie des opérations impliquant des variables
binaires.
Par convention, les deux valeurs que peut prendre une variable booléenne
sont appelées vrai et faux.
Ces deux valeurs peuvent aussi être dénotées par des nombres: vrai = 1,
faux = 0.
15
Les tables de vérité
Définition: Une fonction booléenne d’arité n est une fonction de n
variables booléennes d’entrée vers une variable booléenne de sortie (n ≥ 0).
Pour définir une fonction booléenne, il suffit de donner sa valeur de sortie
pour toutes les combinaisons possibles de valeurs de ses arguments.
La table associant ces valeurs de sortie aux combinaisons de valeurs
d’entrée est appelée table de vérité.
La table de vérité d’une fonction d’arité n possède 2n lignes.
16
Exemple
Table de vérité de la fonction f à trois arguments qui est vraie si et
seulement si exactement deux de ses arguments sont vrais:
x1 x2 x3 f (x1, x2, x3)
0 0 0
0
0 0 1
0
0 1 0
0
0 1 1
1
1 0 0
0
1 0 1
1
1 1 0
1
1 1 1
0
17
Les fonctions booléennes de base
Question: Combien y a-t-il de fonctions booléennes distinctes d’arité n ?
Réponse:
• La table de vérité d’une fonction d’arité n possède 2n lignes, et
• Chaque ligne d’une table de vérité peut prendre la valeur 0 ou la
valeur 1.
n
• ; Il y a 22 tables de vérité distinctes.
2
Il existe donc 22 = 16 fonctions booléennes d’arité 2.
Certaines de ces fonctions présentent un intérêt particulier.
18
La fonction AND
Cette fonction possède la table de vérité suivante:
x1 x2 AND(x1, x2)
0 0
0
0 1
0
1 0
0
1 1
1
Elle se dénote par l’opérateur binaire “·”:
AND(x1, x2) = x1 · x2
La valeur x1 · x2 est vraie si et seulement si x1 et x2 sont vrais.
19
La fonction OR
Cette fonction possède la table de vérité suivante:
x1 x2 OR(x1, x2)
0 0
0
0 1
1
1 0
1
1 1
1
Elle se dénote par l’opérateur binaire “+” :
OR(x1, x2) = x1 + x2
La valeur x1 + x2 est vraie si et seulement si x1 ou x2 sont vrais.
20
La fonction XOR
Cette fonction (aussi appelée ou exclusif) possède la table de vérité
suivante:
x1 x2 XOR(x1, x2)
0 0
0
0 1
1
1 0
1
1 1
0
Elle se dénote par l’opérateur binaire “⊕” :
XOR(x1, x2) = x1 ⊕ x2
La valeur x1 ⊕ x2 est vraie si et seulement si x1 ou bien x2 est vrai.
21
La fonction NAND
Cette fonction possède la table de vérité suivante:
x1 x2 NAND(x1, x2)
0 0
1
0 1
1
1 0
1
1 1
0
Remarque: Pour les mêmes valeurs d’arguments, cette fonction renvoie
toujours une valeur opposée à celle de la fonction AND. On a donc
NAND(x1, x2) = NOT (AND(x1, x2)),
où NOT est une fonction unaire renvoyant une valeur différente de celle
de son argument.
22
La fonction NOT
La table de vérité de cette fonction est par conséquent la suivante:
x1 NOT (x1)
0
1
1
0
Elle se dénote par une barre horizontale au dessus de son argument, ou
bien par l’opérateur unaire ¬ :
NOT (x1) = x1 = ¬x1.
On a donc
NAND(x1, x2) = x1 · x2.
23
La fonction NOR
Cette fonction possède la table de vérité suivante:
x1 x2 NOR(x1, x2)
0 0
1
0 1
0
1 0
0
1 1
0
Remarque: Pour les mêmes valeurs d’arguments, cette fonction renvoie
toujours une valeur opposée à celle de la fonction OR. On a donc
NOR(x1, x2) = x1 + x2.
24
Les expressions booléennes
Les opérateurs ·, +, ⊕ et
permettent de construire des expressions.
Par convention, l’opérateur · a une priorité plus élevée que + et ⊕:
x1 + x2 · x3 est équivalent à x1 + (x2 · x3).
De même, x1 ⊕ x2 · x3 est équivalent à x1 ⊕ (x2 · x3).
Nous allons étudier quelques propriétés des expressions booléennes.
25
La commutativité
Les opérateurs ·, + et ⊕ sont commutatifs:
x1 · x2 = x2 · x1 ,
x1 + x2 = x2 + x1 ,
x1 ⊕ x2 = x2 ⊕ x1 .
L’associativité
Les opérateurs ·, + et ⊕ sont associatifs:
x1 · (x2 · x3) = (x1 · x2) · x3,
x1 + (x2 + x3) = (x1 + x2) + x3,
x1 ⊕ (x2 ⊕ x3) = (x1 ⊕ x2) ⊕ x3.
Remarque: L’associativité permet d’éliminer les parenthèses des
expressions précédentes.
26
La distributivité
L’opérateur · est distributif sur les opérateurs + et ⊕:
x1 · (x2 + x3) = (x1 · x2) + (x1 · x3),
x1 · (x2 ⊕ x3) = (x1 · x2) ⊕ (x1 · x3).
L’opérateur + est distributif sur l’opérateur ·:
x1 + (x2 · x3) = (x1 + x2) · (x1 + x3).
Remarque: Cette dernière propriété n’est pas valide en arithmétique !
27
Les règles de DeMorgan
Ces règles permettent d’exprimer chacun des opérateurs + et · en
fonction de l’autre et du complément :
x1 + x2 + · · · + xn = x1 · x2 · · · · · xn,
x1 · x2 · · · · · xn = x1 + x2 + · · · + xn.
Il est aussi possible d’exprimer l’opérateur ⊕ en fonction des autres
opérateurs:
x1 ⊕ x2 = x1 · x2 + x1 · x2.
28
Les règles d’absorption
Ces règles permettent de simplifier certaines expressions:
x1 + (x1 · x2) = x1
x1 + (x1 · x2) = x1 + x2
x1 ⊕ (x1 · x2) = x1 · x2
x1 · (x1 + x2) = x1
x1 · (x1 + x2) = x1 · x2
x1 · (x1 ⊕ x2) = x1 · x2
Autres règles
x1 + 1 = 1
x1 + 0 = x1
x1 + x1 = x1
x1 + x1 = 1
x1 · 0 = 0
x1 · 1 = x1
x1 · x1 = x1
x1 · x1 = 0
x1 ⊕ 0 = x1
x1 ⊕ 1 = x1
x1 ⊕ x1 = 0
x1 ⊕ x1 = 1
29
Exercice
On souhaite construire une expression booléenne dénotant la fonction
possédant la table de vérité
x1 x2 x3 f (x1, x2, x3)
0 0 0
0
0 0 1
0
0 1 0
0
0 1 1
1
1 0 0
0
1 0 1
1
1 1 0
1
1 1 1
0
Cette fonction n’est vraie que pour trois valeurs de ses arguments:
(0, 1, 1),
(1, 0, 1),
(1, 1, 0).
30
Pour chaque valeur des arguments, on peut écrire une expression qui est
vraie pour cette valeur, et fausse pour toutes les autres:
f(0,1,1)(x1, x2, x3) = x1 · x2 · x3
f(1,0,1)(x1, x2, x3) = x1 · x2 · x3
f(1,1,0)(x1, x2, x3) = x1 · x2 · x3.
La fonction f est vraie si au moins une des trois fonctions précédentes est
vraie pour les mêmes valeurs des arguments:
f (x1, x2, x3) = f(0,1,1)(x1, x2, x3) + f(1,0,1)(x1, x2, x3) + f(1,1,0)(x1, x2, x3)
= x1 · x2 · x3 + x1 · x2 · x3 + x1 · x2 · x3 .
En appliquant les règles de l’algèbre booléenne:
f (x1, x2, x3) = (x1 · x2 + x1 · x2) · x3 + x1 · x2 · x3
= (x1 ⊕ x2) · x3 + x1 · x2 · x3.
31
Les niveaux de tension
Les circuits de l’ordinateur manipulent les valeurs booléennes en associant
un niveau de tension nominal à chacune d’elles.
Il est important de pouvoir distinguer fiablement les deux valeurs, même
en présence de bruit. On choisit donc deux niveaux de tension les plus
éloignés possible l’un de l’autre:
• La tension nulle pour la valeur 0;
• La tension d’alimentation pour la valeur 1.
Il est cependant impossible de construire des circuits qui produisent
exactement ces tensions. On définit donc des intervalles de validité plutôt
que des niveaux de tension ponctuels.
Les circuits sont construits de façon à ne générer que des signaux valides.
32
Les marges d’erreur
Bien que les signaux soient valides à la sortie des composants qui les
génèrent, ils sont corrompus par une certaine quantité de bruit avant
d’arriver à l’entrée d’autres composants.
On tient compte de ce bruit en dotant chaque intervalle de validité d’une
marge d’erreur qui lui est adjacente. Les signaux situés dans les marges
d’erreur peuvent être fiablement décodés en valeurs booléennes.
33
Exemple
5 V
Intervalle de validité
(valeur 1)
4 V
Marge d’erreur (1)
3, 5 V
Plage interdite
1, 5 V
Marge d’erreur (0)
1 V
Intervalle de validité
(valeur 0)
0 V
34
La discipline statique
Un circuit ne peut être connecté à d’autres circuits que s’il satisfait aux
règles suivantes:
• Si on fournit des signaux valides constants aux entrées du circuit, alors
ce dernier finira par générer des signaux de sortie valides après un
certain délai de propagation.
• Un signal d’entrée est considéré valide si sa tension se situe dans un
des deux intervalles de validité ou dans la marge d’erreur
correspondante (mais pas dans la plage interdite).
• Un signal de sortie est considéré valide si sa tension appartient à un
des deux intervalles de validité (mais pas à une marge d’erreur ni à la
plage interdite).
L’ensemble de ces règles constitue une discipline statique. Celle-ci
garantit l’absence de signaux invalides en dehors des périodes de
propagation et de transition des valeurs.
35
Les familles logiques
Il existe plusieurs types de circuits capables de traiter des signaux digitaux.
Une famille logique est une norme définissant
• des niveaux de tension (intervalles de validité, marges d’erreur);
• des circuits de base;
• un ensemble de contraintes à respecter (sur la forme des connexions
permises, les temps de propagation, . . . );
• un procédé de fabrication des composants;
• ...
Les principales familles actuellement utilisées sont CMOS et TTL.
36
Les portes logiques
Les portes logiques sont des circuits digitaux élémentaires réalisant les
fonctions booléennes de base.
Les symboles conventionnels attribués aux portes sont les suivants:
x1
x2
x1 · x2
x1
x2
x1 · x2
x1
x2
x1 + x2
x1
x2
x1 + x2
x1
x2
x1 ⊕ x2
x1
x1
x1
x1
Remarques:
• Ces symboles peuvent aussi décrire des portes possédant plus de deux
entrées;
• Bien sûr, les portes respectent la discipline statique !
37
L’interconnexion des portes
L’interconnexion de plusieurs portes logiques permet de construire des
circuits plus complexes.
Les règles d’interconnexion sont les suivantes:
• On ne peut pas connecter entre elles les sorties de plusieurs portes, ou
différentes entrées d’un même circuit;
• Il est permis de connecter la sortie d’une porte aux entrées d’autres
portes.
Exemple: Porte AND à trois entrées construite à partir de deux portes à
deux entrées:
x1
x2
x3
x1 · x2 · x3
38
Les circuits combinatoires
Un chemin est un parcours d’un circuit, à partir d’un de ses points,
effectué en suivant les connexions et en franchissant les portes d’une
entrée vers la sortie.
Un cycle est un chemin dont le point d’origine et le point de destination
sont identiques, et qui franchit au moins une porte.
Définition:
Un circuit combinatoire est un circuit digital dont aucun chemin
n’est un cycle.
Propriété: Les valeurs booléennes générées aux sorties d’un circuit
combinatoire dépendent uniquement des valeurs fournies aux entrées de
celui-ci.
En d’autres termes, un circuit combinatoire à n entrées et m sorties peut
être défini par m fonctions booléennes d’arité n.
39
Remarque: Sous l’hypothèse où toutes les portes possèdent le même délai
de propagation, le délai de propagation maximal d’un circuit combinatoire
correspond au chemin le plus long d’une entrée vers une sortie.
40
Exemple 1
Circuit combinatoire réalisant la fonction d’arité 3 vraie si et seulement si
deux de ses entrées sont vraies:
x1
x2
x3
x1 ⊕ x2
(x1 ⊕ x2 ) · x3
x3
f
x2
x1
x1 · x2 · x3
x3
Temps de propagation maximal: 3τ , où τ est le temps de propagation
maximal d’une porte.
41
Exemple 2
Circuit à deux entrées contrôlant un affichage à sept segments. Le chiffre
affiché totalise le nombre d’entrées vraies. Un segment est allumé lorsque
la sortie correspondante est vraie:
x1
x2
1
a
b
a
c
f
d
e
g
d
b
c
e
f
g
Temps de propagation maximal: 2τ .
42
L’instabilité
Il est facile de construire des circuits qui ne sont pas combinatoires:
Ce circuit possède une particularité: Il est impossible d’affecter une valeur
booléenne fixe à sa seule connexion ! Ce circuit est instable.
Définition:
Un circuit est stable s’il est possible d’affecter une valeur booléenne
persistante à chacune de ses connexions.
43
Les circuits instables sont à proscrire ! En pratique, de tels circuits
génèrent
• des signaux invalides, ou
• des oscillations.
44
Les circuits non combinatoires stables
Tous les circuits non combinatoires ne sont pas instables:
x1
x2
L’attribution des valeurs x1 = 0 et x2 = 1 est persistante, et donc le circuit
est stable. Le choix des valeurs x1 = 1 et x2 = 0 est également persistant.
Remarque: La stabilité d’un circuit ne garantit pas l’absence de signaux
invalides ou d’oscillations dans une réalisation pratique de ce circuit !
45
Les verrous
Le circuit précédent possède deux points de stabilité, et peut donc se
trouver dans deux états distincts. Il est donc capable de mémoriser un bit
d’information.
Ce circuit ne permet cependant pas de choisir la valeur booléenne
mémorisée. Pour pallier cet inconvénient, on lui ajoute des entrées
permettant de contrôler la valeur circulant dans le cycle:
s
q
r
Le circuit obtenu porte le nom de verrou.
46
Le fonctionnement d’un verrou
• Si s = 0 et r = 0: Le circuit est équivalent à deux inverseurs en
boucle, et mémorise donc un bit d’information.
La valeur mémorisée peut être vue comme celle présente à la sortie q.
• Si s = 1 et r = 0: La valeur mémorisée devient égale à 1 (set).
• Si s = 0 et r = 1: La valeur mémorisée devient égale à 0 (reset).
Le verrou est donc capable de retenir laquelle des entrées s ou r a été
activée en dernier lieu.
• Si s = 1 et r = 1: La valeur de mémorisée devient égale à 0, mais
peut ensuite basculer vers n’importe quelle valeur lorsque s et r
reprennent la valeur 0. Une telle condition de course est à éviter !
47
Le signal d’horloge
L’utilisation des verrous pose plusieurs problèmes:
• Le verrou charge une nouvelle valeur dès le moment où une de ses
entrées prend la valeur 1. Ce moment peut dépendre des délais de
propagation d’autres portes.
• Il faut garantir l’absence de conditions de course.
On souhaite que les données mémorisées par un circuit ne soient
modifiées qu’à des instants ponctuels, bien déterminés.
La solution consiste à fournir au circuit un signal d’horloge. Ce signal est
généré par un composant spécial, et est constitué d’une alternance
périodique de valeurs 0 et 1.
φ :
48
Les valeurs mémorisées par ce circuit ne sont alors modifiées qu’aux
instants où l’horloge effectue une transition de la valeur 0 à la valeur 1
(c’est-à-dire lors de ses flancs montants).
Note: Une autre convention consiste à considérer les transitions de la
valeur 1 à la valeur 0 (flancs descendants).
49
Le flip-flop
Le composant de mémorisation élémentaire présent dans les circuits basés
sur une horloge est le flip-flop.
Symbole:
d
d
q
q
φ
Fonctionnement:
• Un flip-flop est capable de retenir un bit. La valeur retenue est
disponible à la sortie q;
• Lors d’un flanc montant de l’horloge, le flip-flop charge la valeur
présente à l’entrée d. (On dit que le flip-flop est déclenché par le
flanc.)
50
Les délais d’un flip-flop
Le fonctionnement d’un flip-flop n’est pas instantané:
• La valeur mémorisée n’est disponible à la sortie qu’un certain temps
après avoir été chargée. Ce délai est le délai de propagation τp du
flip-flop;
• Pour qu’une valeur d’entrée puisse être chargée, il faut qu’elle reste
constante un certain laps temps avant le coup d’horloge. Ce délai est
le délai de stabilisation τs du flip-flop.
Exemple:
τs τp
τs τp
τs τp
d
q
φ
51
Les registres
En général, un circuit mémorise plus d’un bit d’information. Un registre
est un composant obtenu en regroupant plusieurs flip-flops partageant la
même horloge.
Circuit équivalent:
d1
d
q
Symbole:
q1



d2
d
..
.
dn
q
..
.
..
.
d
q2
q
d1
d2
..
.
dn


n


d
q
n


q1
q2
..
.
qn



φ
qn
φ
52
Les circuits séquentiels
Dans un circuit digital, on peut séparer les composants mémorisant les
données de ceux dédiés à leur traitement.
Un circuit séquentiel est un circuit possédant la forme générale suivante:
Sorties o1 , o2 , . . .
Circuit
Entrées i1 , i2 , . . .
combinatoire
n
n
n
d
q
n
φ
Les valeurs retenues par le registre déterminent l’état du circuit. La
capacité du registre étant de n bits, le circuit peut potentiellement se
trouver dans 2n états.
53
Fonctionnement d’un circuit séquentiel
Soient
• T la période de l’horloge;
• τc le temps de propagation du circuit combinatoire;
• τp le temps de propagation du registre;
• τs le temps de stabilisation du registre.
Si T > τc + τp + τs, le circuit change d’état à chaque coup d’horloge. Lors
d’un changement d’état, le nouvel état st+1 est déterminé par le circuit
combinatoire à partir de
• l’état précédent st, et
• la valeur it des entrées du circuit.
On a donc st+1 = f (st, it), où f est une fonction de transition réalisée par
le circuit combinatoire.
54
La discipline dynamique
Pour que le changement d’état s’effectue correctement, les entrées du
circuit doivent rester stables pendant une durée au moins égale à τc + τs
avant chaque coup d’horloge.
Un circuit séquentiel respectant cette condition obéit à la règle de
discipline dynamique.
Un circuit séquentiel peut également posséder des sorties. Leur valeur ot
est déterminée par le circuit combinatoire à partir de
• l’état courant st, et
• la valeur it des entrées du circuit.
On a donc ot = f 0(st, it), où f 0 est une fonction de sortie réalisée par le
circuit combinatoire.
Remarque: La stabilité des sorties n’est garantie que pendant un certain
intervalle précédant chaque coup d’horloge.
55
Illustration
Entrées i
Etat s
Sorties o
Horloge φ
56
Exemple
Circuit séquentiel d’un compteur pilotant un affichage à sept segments:
a
f
e
g
d
a
b
1
c
b
c
d
e
d1
d2
q1
q2
f
g
i
φ
57
Fonction de transition:
Etat courant
q1
q2
0
0
0
0
1
1
1
1
Entrée
i
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
Etat suivant
q1
q2
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
Fonction de sortie:
Etat
q1
0
0
1
1
q2
0
1
0
1
a
0
1
1
0
b
1
1
1
1
c
1
0
1
1
Sorties
d
0
1
1
0
e
0
1
0
0
f
0
0
0
1
g
0
1
1
1
58
Chapitre 2
La représentation des données
59
La représentation des nombres entiers positifs
Problème: On souhaite représenter des nombres naturels à l’aide de n bits.
Solution: Il suffit d’encoder les nombres en base 2:
• On attribue à chaque bit une position de 0 à n − 1. Par convention,
on procède de droite à gauche;
• On affecte au bit de position k le poids 2k .
Le nombre représenté par la suite de bits bn−1bn−2 . . . b1b0 est donc égal à
n−1
X
bi2i.
i=0
Ce procédé porte le nom de représentation binaire non signée des nombres.
60
Exemple: la représentation binaire non signée 10110101 dénote le nombre
181:
Position : 7 6 5 4 3 2 1 0
Poids
: 27 26 25 24 23 22 21 20
1
0
1
1
0
1
0
1
On a en effet
7
X
bi2i = 27 + 25 + 24 + 22 + 20
i=0
= 128 + 32 + 16 + 4 + 1
= 181.
Note: Les bits situés aux positions 0 et n − 1 sont respectivement appelés
bit de poids faible et bit de poids fort.
61
Calcul de la représentation d’un nombre
La représentation d’un nombre v peut se calculer grâce aux deux
propriétés suivantes:
• Le bit de poids faible est égal à 0 si v est pair, et à 1 si v est impair;
• En retirant le bit de poids faible d’une représentation de v, on obtient
une représentation de bv/2c.
On a donc l’algorithme suivant:
1. Si v est pair, écrire 0. Sinon, écrire 1;
2. Remplacer v par bv/2c;
3. Répéter les deux opérations précédentes tant que v 6= 0.
62
Remarques:
• Cet algorithme génère les bits de la représentation de v en
commençant par le bit de poids faible (c’est-à-dire de la droite vers la
gauche);
• La suite de bits obtenue constitue la représentation la plus courte du
nombre v. Des représentations plus longues s’obtiennent en préfixant
le résultat d’un nombre quelconque de zéros.
Exemple: Représentation du nombre 109:
v = 109
v = 54
v = 27
v = 13
v=6
v=3
v=1
v = 0.
impair
pair
impair
impair
pair
impair
impair
−→
−→
−→
−→
−→
−→
−→
1
0
1
1
0
1
1
La représentation obtenue est donc 1101101. Il est permis d’ajouter un
nombre arbitraire de zéros en tête de cette représentation.
63
Les valeurs représentables
A l’aide de n bits, il n’est pas possible de représenter plus de 2n valeurs
distinctes.
L’algorithme de calcul de la représentation d’un nombre v s’arrête après
avoir produit n bits ou moins si et seulement si v < 2n.
Les nombres possédant une représentation binaire non signée sur n bits
sont donc les éléments de l’intervalle
[0, . . . , 2n − 1].
64
L’arithmétique binaire non signée
Les opérations d’addition et de multiplication de nombres entiers non
signés peuvent s’effectuer selon les règles du calcul écrit.
Les tables d’addition binaire sont les suivantes (les reports sont dénotés
par un rectangle):
0
+ 0
0
+
1
0
0
1
0
+ 1
1
+
1
0
1
1
0
1
+ 0
1
1
+ 1
1
0
+
1
1
0
+
1
1
1
1
0
1
1
L’opération d’addition s’effectue bit par bit, en commençant par le bit de
poids faible.
65
Exemple: Calcul de la somme 123 + 456 = 579:
1
0
+ 0
1
1
0
1
0
1
0
1
0
1
1
1
1
1
1
0
0
1
1
0
0
1
1
0
0
0
0
1
0
1
1
0
1
66
La multiplication de nombres binaires non signés
Le calcul d’un produit s’effectue selon des règles analogues à celles du
calcul décimal:
1. Des produits partiels sont successivement calculés pour chaque bit du
multiplicateur, et convenablement alignés;
2. Ces produits partiels sont ensuite additionnés.
La table de multiplication binaire est la suivante:
0
× 0
0
0
× 1
0
1
× 0
0
1
× 1
1
67
Exemple: Calcul du produit 34 × 12 = 408:
×
0
1 0
+ 1 0 0
1 1 0
1 0 0
1
0 0 0
0 0 0
0 0 1
0 1 0
0 1 1
0
1
0
0
0
1 0
0 0
0 0
0
0 0 0
68
La représentation hexadécimale
La représentation binaire utilisée par les ordinateurs est mal adaptée aux
opérations manuelles. Dans certains cas, il est cependant indispensable de
pouvoir raisonner sur la représentation interne des données. On utilise
alors la représentation hexadécimale (c’est-à-dire en base 16), qui présente
deux avantages:
• Elle est concise;
• Les conversions de l’hexadécimal vers le binaire et vice-versa sont
immédiates.
Un chiffre hexadécimal peut prendre 16 valeurs: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
A, B, C, D, E, F. Un tel chiffre représente donc exactement 4 bits
d’information.
Pour convertir un nombre hexadécimal en binaire, il suffit de remplacer
chaque chiffre par la séquence de 4 bits qui lui correspond. La conversion
réciproque est similaire.
69
Table de conversion:
Hexadécimal Binaire Hexadécimal Binaire
0
1
2
3
4
5
6
7
0000
0001
0010
0011
0100
0101
0110
0111
8
9
A
B
C
D
E
F
1000
1001
1010
1011
1100
1101
1110
1111
Note: Lorsque le contexte ne permet pas de déterminer la base choisie
pour représenter les nombres, on ajoute le suffixe “h” ou le préfixe “0x”
aux représentations hexadécimales, et le suffixe “b” ou le préfixe “0b” aux
représentations binaires.
Exemple: On a
0xCAFE007 = 1100101011111110000000000111b = 212852743.
70
La représentation des nombres entiers signés
Il existe plusieurs procédés permettant de représenter des nombres entiers
positifs et négatifs:
• La représentation par valeur signée;
• La représentation par complément à un;
• La représentation par complément à deux.
Ces trois méthodes possèdent des points communs:
• Le signe d’un nombre est représenté par le bit de poids fort (ici appelé
bit de signe). Celui-ci est égal à
– 0 pour les nombres positifs;
– 1 pour les nombres négatifs.
• La représentation d’un nombre positif est toujours identique à sa
représentation binaire non signée de même taille.
71
La représentation par valeur signée
Principe: A la suite du bit de signe, on place la représentation binaire non
signée de la valeur absolue du nombre représenté.
Exemple: La représentation sur 8 bits du nombre −42 est égale à
10101010. En effet
• Ce nombre est négatif, donc le bit de signe est égal à 1;
• La représentation binaire non signée sur 7 bits de 42 = | − 42| est
0101010.
Selon ce procédé, le nombre v représenté par le groupe de bits
bn−1bn−2 . . . b1b0 est égal à
v = (1 − 2bn−1)
n−2
X
bi 2 i .
i=0
72
Les valeurs représentables
A l’aide de n bits, la représentation par valeur signée permet d’encoder
• tous les éléments de l’intervalle [0, . . . , 2n−1 − 1] (bit de signe égal à
0), et
• tous les éléments de l’intervalle [−2n−1 + 1, . . . , 0] (bit de signe égal à
1).
L’ensemble des valeurs représentables est donc l’intervalle
[−2n−1 + 1, . . . , 2n−1 − 1].
Remarques:
• Le nombre 0 possède deux représentations distinctes;
• Ce procédé rend difficile le calcul des opérations arithmétiques.
73
La représentation par complément à un
Principe: La représentation d’un nombre est similaire à sa représentation
par valeur signée, mais les bits qui suivent le bit de signe sont
complémentés (0 est remplacé par 1, et vice-versa).
Exemple: La représentation sur 8 bits du nombre −42 est égale à
11010101. En effet
• Ce nombre est négatif, donc le bit de signe est égal à 1;
• La représentation binaire non signée sur 7 bits de 42 = | − 42| est
0101010, dont le complément est 1010101.
L’ensemble des nombres représentables à l’aide de n bits est identique à
celui obtenu pour la représentation par valeur signée, soit l’intervalle
[−2n−1 + 1, . . . , 2n−1 − 1].
74
Selon ce procédé, le nombre v représenté par le groupe de bits
bn−1bn−2 . . . b1b0 est égal à
(1 − 2n−1)b
n−1 +
n−2
X
bi2i.
i=0
En effet,
• Si v > 0, on a bn−1 = 0 et
v=
n−2
X
bi2i;
i=0
• Si v < 0, on a bn−1 = 1. La suite de bits bn−2 · · · b1 b0 forme la
représentation binaire non signée du nombre
2n−1 − 1 −
n−2
X
bi 2 i .
i=0
On a donc bien
v = −|v| = 1 − 2n−1 +
n−2
X
bi2i.
i=0
75
L’arithmétique des nombres représentés par complément à un
Les algorithmes de calcul arithmétique sur les nombres non signés peuvent
facilement être adaptés à la représentation par complément à un.
L’addition de deux nombres signés représentés à l’aide de n bits s’effectue
de la façon suivante:
1. On additionne les deux nombres comme s’il s’agissait de
représentations non signées;
2. Si l’opération conduit à un report à la position n, on supprime ce
report et on ajoute 1 à la somme calculée.
76
Exemples: Calcul de la somme 12 + (−34) = −22:
0
+ 1
1
0
1
1
1
0
0
1
1
0
1
0
1
1
1
1
1
1
0
0
0
0
0
1
1
Calcul de la somme −12 + (−34) = −46:
1
1
1
+ 1
1
+
1
1
1
1
1
1
1
0
0
1
1
1
1
1
0
1
0
1
0
1
0
1
1
0
0
1
0
1
0
0
0
1
1
0
1
1
77
La représentation par complément à deux
Principes: La représentation d’un nombre v sur n bits est égale
1. au bit de signe 0 suivi de la représentation entière non signée de v sur
n − 1 bits si v ≥ 0;
2. à la représentation par complément à un de v + 1 sur n bits si v < 0.
On dit alors que les n bits ainsi obtenus forment le complément à deux
des n bits encodant le nombre positif −v.
Exemples:
• La représentation sur 8 bits du nombre −42 est égale à 11010110;
• La représentation sur n bits du nombre −1 est composée de n bits
égaux à 1.
78
Propriétés:
• Le nombre v représenté par le groupe de bits bn−1bn−2 . . . b1b0 est égal
à
−2n−1bn−1 +
n−2
X
bi2i;
i=0
• La représentation d’un nombre à l’aide d’un nombre de bits donné est
unique. En particulier, le nombre 0 possède une seule représentation;
• L’ensemble des nombres représentables à l’aide de n bits forme
l’intervalle
[−2n−1, . . . , 2n−1 − 1].
79
L’arithmétique binaire signée
Les opérations arithmétiques sont faciles à effectuer sur des nombres
représentés par la méthode du complément à deux:
• L’addition de deux nombres de n bits s’effectue par le même
algorithme que celui employé dans le cas des nombres non signés. Les
reports apparaissant à la position n sont simplement ignorés;
• La soustraction de deux nombres s’effectue en ajoutant au premier
l’opposé du deuxième. La représentation du nombre −v est égale au
complément à deux de la représentation de v;
• La multiplication de deux nombres d’effectue de façon similaire au cas
des entiers non signés. La seule différence est que les nombres de bits
choisis pour représenter les opérandes et le produit calculé doivent ici
coı̈ncider.
80
Exemples
Calcul de la somme 12 + (−34) = −22:
0
+ 1
1
0
1
1
1
0
0
1
1
0
1
0
1
1
1
1
1
1
0
0
1
1
0
0
0
1
1
0
0
1
1
0
0
0
Calcul de la somme −12 + (−34) = −46:
1
1
1
+ 1
1
1
1
1
1
1
1
0
0
1
1
1
1
1
0
1
0
81
Calcul du produit −34 × 12 = −408:
1
× 0
0
0
1
1
0
0
0
0
0
+ 0
1
1
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
1
1
0
0
0
0
0
0
0
1
1
0
0
1
0
0
0
1
1
0
1
1
0
0
1
0
1
1
0
0
0
1 0
0 0
0 0
0
0 0 1 1 0 1 0 0 0
82
Récapitulatif
Le tableau suivant reprend les différentes représentations des nombres
entiers à l’aide de 4 bits:
Bits
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Non signée Valeur signée Compl. à 1 Compl. à 2
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
1
2
3
4
5
6
7
0
−1
−2
−3
−4
−5
−6
−7
0
1
2
3
4
5
6
7
−7
−6
−5
−4
−3
−2
−1
0
0
1
2
3
4
5
6
7
−8
−7
−6
−5
−4
−3
−2
−1
83
La représentation des nombres réels
A l’aide d’un nombre de bits donné, il n’est bien sûr pas possible de
représenter les nombres réels avec une précision illimitée.
Une première solution consiste à ne tenir compte que d’un nombre fixé de
chiffres après la virgule, et à négliger la valeur des chiffres suivants. Ce
procédé porte le nom de représentation en virgule fixe.
En pratique, il est cependant indispensable de pouvoir représenter des
nombres très grands (p.ex., des distances astronomiques) comme très
petits (p.ex., des mesures à l’échelle atomique), avec une précision
semblable.
On représente alors les nombres en virgule flottante, ce qui permet de
dissocier la grandeur d’un nombre de la précision avec laquelle il est
représenté.
84
La représentation en virgule flottante
Selon cette méthode, un nombre réel r s’exprime sous la forme
r = f × be ,
où
• b est une base fixée;
• f est un nombre réel appelé mantisse;
• e est un nombre entier appelé exposant.
La base est égale à 10 pour la notation scientifique utilisée pour les
calculs manuels, et à 2 pour les représentations informatiques.
La mantisse et l’exposant sont représentés à l’aide d’un nombre de bits
fixé. La mantisse est représentée en virgule fixe.
85
Propriétés:
• Les valeurs de l’exposant déterminent l’intervalle des valeurs
représentables;
• Le nombre de bits choisi pour représenter la mantisse caractérise la
précision avec laquelle les nombres sont représentés;
• En général, la représentation d’un nombre réel ne contient pas
suffisamment d’information pour connaı̂tre la valeur exacte de ce
nombre. Il faut tenir compte de cette erreur d’arrondi lors de
l’interprétation de résultats.
86
Le standard IEEE 754
Ce standard, très utilisé, définit trois procédés de représentation:
• La simple précision:
1
8
23
S
Exposant
Mantisse
bits
• La double précision:
1
11
52
S
Exposant
Mantisse
bits
• La précision étendue: Cette représentation encode un nombre à l’aide
de 80 bits. Elle n’est pratiquement utilisée que pour des opérations
internes aux composants. Nous ne l’étudions pas dans le cadre de ce
cours.
Le champ S est un bit de signe. Comme dans le cas des entiers, il vaut 0
pour les nombres positifs et 1 pour les nombres négatifs.
87
L’encodage de l’exposant
L’exposant d’un nombre est représenté de la façon suivante:
• Simple précision: Un exposant e est encodé par la représentation
entière non signée sur 8 bits du nombre e + 127.
L’intervalle des exposants représentables est donc
[−127, . . . , 128].
• Double précision: Un exposant e est encodé par la représentation
entière non signée sur 11 bits du nombre e + 1023.
L’intervalle des exposants représentables est donc
[−1023, . . . , 1024].
88
L’encodage de la mantisse
Le procédé d’encodage de la mantisse diffère suivant la valeur de
l’exposant.
Premier cas: L’exposant n’est pas égal à une valeur extrême (−127 ou
128 pour la simple précision, −1023 ou 1024 pour la double précision).
On dit alors que la mantisse est normalisée.
Dans ce cas, la valeur absolue de la mantisse f représentée par le groupe
de bits b1b2 . . . bm (avec m = 23 pour la simple précision et m = 52 pour la
double précision) vaut
|f | = 1 +
m
X
bi2−i.
i=1
Cela implique
1 ≤ |f | < 2
pour toute mantisse normalisée f .
89
Exemple
Calcul de la représentation en simple précision du nombre −7,5:
• Ce nombre est négatif, donc le bit de signe est égal à 1 ;
• Afin d’obtenir une mantisse normalisée, il faut choisir un exposant égal
à 2. On obtient alors
7,5
|f | = 2 = 1,875,
2
qui satisfait bien 1 ≤ |f | < 2;
• La représentation de l’exposant est égale à la représentation entière
non signée sur 8 bits du nombre 2 + 127 = 129, soit 10000001 .
• On a
1,875 = 1 + 2−1 + 2−2 + 2−3.
La mantisse est donc représentée par la suite de bits
11100000000000000000000 .
90
Les mantisses dénormalisées
Deuxième cas: L’exposant est égal à sa valeur minimale (−127 pour la
simple précision et −1023 pour la double précision).
On dit alors que la mantisse est dénormalisée.
Dans ce cas, la valeur absolue de la mantisse f représentée par le groupe
de bits b1b2 . . . bm est égale à
|f | =
m
X
bi2−i+1.
i=1
On a donc
0 ≤ |f | < 2
pour toute mantisse dénormalisée f .
91
Exemple
Calcul de la représentation en simple précision du nombre 2−140:
• Le bit de signe est égal à 0 ;
• Il n’y a pas d’exposant représentable conduisant à une mantisse
normalisée. On choisit donc un exposant égal à −127, dont la
représentation est 00000000 ;
• On a
2−140
|f | = −127 = 2−13,
2
qui satisfait bien 0 ≤ |f | < 2;
• La mantisse est représentée par la suite de bits
00000000000001000000000 .
92
Le cas du nombre zéro
Une représentation du nombre 0 doit nécessairement posséder une
mantisse dénormalisée. La valeur de l’exposant est donc fixée.
On a cependant la possibilité de choisir un bit de signe égal à 1 ou à 0.
Cela conduit donc à deux représentations distinctes du nombre 0:
• Une représentation entièrement composée de bits égaux à 0 (zéro
positif);
• Une représentation composée d’un bit égal à 1 suivi de bits égaux à 0
(zéro négatif).
Cette propriété peut être exploitée pour retenir le signe de quantités
infinitésimales.
93
Les valeurs exceptionnelles
Troisième cas: L’exposant est égal à sa valeur maximale (128 pour la
simple précision et 1024 pour la double précision).
Cette situation sert à encoder des valeurs exceptionnelles, qui ne
représentent pas des nombres réels:
• Si tous les bits de la mantisse sont égaux à 0: La représentation
correspond à un dépassement
– vers les valeurs positives si le bit de signe est 0;
– vers les valeurs négatives si le bit de signe est 1.
Ces deux valeurs sont souvent (improprement) appelées infini positif
et infini négatif.
94
• Si au moins un bit de la mantisse est égal à 1: La représentation
correspond à une valeur indéfinie.
Cette valeur se note NaN (Not a Number).
95
Les nombres représentables
L’ensemble des réels représentables à l’aide d’un nombre de bits donné ne
constitue pas un intervalle. En effet, nous savons que les réels ne sont
représentés qu’avec une précision limitée, et donc que l’ensemble des réels
représentables ne forme pas un continuum.
Il est cependant utile de connaı̂tre les bornes des intervalles contenant les
réels représentables. La situation est la suivante:
valeurs
trop petites
valeurs
trop grandes
intervalles contenant les valeurs représentables
0
valeurs trop petites en valeur absolue
96
Plus grande valeur absolue représentable:
• Simple précision: L’exposant est égal à 127 et la mantisse à 2 − 2−23.
On a donc l’intervalle
[−3,403.1038, . . . , 3,403.1038].
• Double précision: L’exposant est égal à 1023 et la mantisse à 2 − 2−52.
On a donc l’intervalle
[−1,798.10308, . . . , 1,798.10308].
Plus petite valeur strictement positive représentable:
• Simple précision: L’exposant est égal à −127 et la mantisse à 2−22.
On a donc l’intervalle de valeurs non représentables
[−10−45, . . . , 10−45].
97
• Double précision: L’exposant est égal à −1023 et la mantisse à 2−51.
On a donc l’intervalle
[−4.10−324, . . . , 4.10−324].
98
L’addition de nombres en virgule flottante
L’addition de deux nombres r1 = f12e1 et r2 = f22e2 s’effectue de la façon
suivante (on suppose |r1| ≤ |r2|):
1. On remplace e1 par e01 = e2, et f1 par
f10 = f12e1−e2 .
Note: Cela peut conduire à perdre un certain nombre de bits de la
représentation de f1.
2. On remplace chaque mantisse négative par son complément à deux;
3. On calcule la somme f = f10 + f2;
4. Si le résultat est négatif, on le remplace par son complément à deux;
0
5. On normalise f 2e1 de façon à obtenir une mantisse normalisée ou
dénormalisée.
99
La multiplication de nombres en virgule flottante
La multiplication de deux nombres r1 = f12e1 et r2 = f22e2 s’effectue
grâce à l’algorithme suivant:
1. On détermine le signe du produit;
2. On calcule la somme e1 + e2 à l’aide de l’arithmétique entière;
3. On effectue le produit f = f1 × f2 en virgule fixe;
4. On normalise éventuellement le résultat f 2e de façon à obtenir une
mantisse normalisée ou dénormalisée.
100
La représentation des caractères
Il existe plusieurs standards de codification des caractères
alphanumériques.
Le code ASCII
Ce standard est à la base d’une grande majorité des encodages
actuellement utilisés.
Principes:
• Un caractère est encodé à l’aide de 7 bits d’information. On peut
donc attribuer à chaque symbole un code dans l’intervalle [0, . . . , 127];
• Les codes de 0x00 à 0x1F représentent des caractères de contrôle.
L’interprétation de ces caractères peut dépendre du système utilisé;
101
• Les codes de 0x20 à 0x3F correspondent aux symboles
mathématiques, à la ponctuation et aux chiffres. Le code du chiffre n
est égal à 0x3n;
Remarque: La valeur d’un chiffre est donc égale aux quatre bits de
poids faible de son encodage ASCII.
• Les codes de 0x40 à 0x5F contiennent les lettres majuscules et
quelques symboles spéciaux. Les lettres sont classées par ordre
alphabétique et possèdent des codes consécutifs, ce qui facilite les
opérations de comparaison entre chaı̂nes de caractères;
• Les codes de 0x60 à 0x7F contiennent les lettres minuscules, un
caractère de contrôle (0x7F) et quelques symboles spéciaux.
Note: Les codes d’une lettre majuscule et minuscule partagent les
mêmes 5 bits de poids faible.
102
Table des caractères imprimables ASCII:
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
!
”
#
$
%
&
’
(
)
*
+
,
.
/
30
31
32
33
34
35
36
37
38
39
3A
3B
3C
3D
3E
3F
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
ˆ
60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
‘
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D
7E
p
q
r
s
t
u
v
w
x
y
z
{
|
}
˜
103
La norme ISO Latin-1
Ce standard représente un caractère à l’aide de 8 bits. Il est basé sur le
code ASCII dont il reprend les 128 premiers caractères.
Les 128 codes supplémentaires (possédant un bit de poids fort égal à 1)
permettent de représenter les caractères accentués les plus utilisés par les
langues européennes.
Le standard ISO Latin-1 est celui utilisé par défaut pour l’interprétation
des pages du World-Wide Web.
104
Le standard Unicode
Certaines langues (principalement orientales) nécessitent un jeu de plus de
256 caractères.
Le standard Unicode a été introduit afin d’unifier la représentation de tous
les symboles nécessaires à la plupart des langues écrites courantes et
historiques.
Principes:
• Dans la version actuelle, les caractères sont numérotés de 0 à 0x10ffff
(anciennement, de 0 à 0xffff).
• Environ 128000 caractères sont définis (début 2017).
105
• Le standard incorpore les jeux de caractères de plusieurs autres
standards de représentation. Notamment, ses 256 premiers caractères
sont identiques à ceux de la norme ISO Latin-1.
• La superposition de certains caractères est possible.
• Plusieurs procédés d’encodage permettent de représenter les chaı̂nes
de caractères sous la forme de flux de données de 8, 16 ou 32 bits.
106
Chapitre 3
Les éléments de base d’un
ordinateur
107
La mémoire vive
Le terme mémoire désigne un composant destiné à contenir une certaine
quantité de données, et à en permettre la consultation.
Il existe plusieurs types de mémoires. La mémoire vive, où RAM (Random
Access Memory), possède les caractéristiques suivantes:
• L’écriture et la lecture de données peuvent être effectuées à volonté.
• Les données mémorisées sont préservées tant que le composant
mémoire reste sous tension.
La mémoire vive sert à mémoriser des programmes, des données à traiter,
les résultats de ces traitements, ainsi que des données temporaires.
108
Les caractéristiques de la mémoire
Un composant mémoire est caractérisé par deux grandeurs:
• La taille de cellule, exprimée en bits. Il s’agit de la quantité
élémentaire d’information pouvant faire l’objet d’une opération de la
mémoire.
• La capacité, exprimée en cellules. Cette capacité représente le nombre
de cellules que la mémoire est capable de contenir.
Notes:
• La taille de cellule est habituellement un multiple de 8.
• La capacité s’exprime souvent en fonction des multiples K (kilo, 210),
M (mega, 220) et G (giga, 230).
109
L’organisation de la mémoire
Une mémoire vive m × n, c’est-à-dire de capacité m et de taille de cellule
n, possède la forme suivante:



a0
a1
..
.
ap−1
2p × n



φ
p
a

d
n


d0
d1
..
.
dn−1



contrôle
• φ est l’entrée d’horloge.
• d0, d1, . . . , dn−1 sont des lignes d’entrée/sortie. Celles-ci servent à
recevoir des valeurs destinées à être mémorisées, et à produire des
valeurs lues en mémoire.
Le nombre n de lignes d’entrée/sortie est égal à la taille de cellule de
la mémoire.
110
• a0, a1, . . . , ap−1 sont des lignes d’adressage. Celles-ci reçoivent une
valeur destinée à identifier la cellule visée par une opération de lecture
ou d’écriture.
Le nombre p de lignes d’adressage et la capacité m de la mémoire
satisfont la contrainte 2p = m.
• Les lignes de contrôle servent à spécifier l’opération devant être
effectuée par la mémoire: lecture, écriture, pas d’opération, . . . .
111
Les opérations de la mémoire vive
Les deux opérations élémentaires sont:
• La lecture d’une cellule: L’adresse de la cellule à lire est placée sur les
lignes d’adressage, et une opération de lecture est demandée via les
lignes de contrôle.
Au coup d’horloge suivant, la mémoire place la valeur de la cellule lue
sur les lignes d’entrée/sortie.
• L’écriture d’une cellule: L’adresse de la cellule à modifier est placée
sur les lignes d’adressage, la valeur à charger dans cette cellule est
placée sur les lignes d’entrée/sortie, et une opération d’écriture est
demandée via les lignes de contrôle.
Au coup d’horloge suivant, la mémoire modifie la valeur de la cellule
spécifiée.
112
Remarques: Le fonctionnement de la mémoire n’est pas instantané:
• Pour qu’une opération s’effectue correctement, il est nécessaire que
les valeurs booléennes fournies au composant restent stables un
certain laps de temps avant le coup d’horloge.
• L’opération n’est effectivement réalisée qu’un certain temps après le
coup d’horloge.
En pratique, on caractérise la vitesse d’une mémoire par le plus petit délai
permis entre deux coups d’horloge successifs. Ce délai est appelé temps
d’accès à la mémoire.
113
La combinaison de composants mémoire
Il y a plusieurs manières de combiner des composants mémoire en vue de
constituer une mémoire capable de retenir une plus grande quantité
d’informations.
Le premier type de combinaison a pour but d’augmenter la taille de cellule
de la mémoire.
Principes:
• On connecte ensemble les lignes d’adressage et (séparément) les
entrées d’horloge des différents composants.
• On juxtapose les lignes d’entrée/sortie des composants.
114
Exemple: Mémoire 256 × 12 construite à partir de trois mémoires 256 × 4:
256 × 4
8



a0
a1
..
.
a7
d
4
256 × 4



a
8
8
a
d

4


d0
d1
..
.
d11



256 × 4
8
φ
a
d
4
contrôle
115
Le deuxième type de combinaison vise à accroı̂tre la capacité de la
mémoire.
Principes:
• On connecte ensemble (séparément) les lignes d’entrée/sortie, les
lignes d’adressage et les entrées d’horloge des différents composants.
• On crée un certain nombre de lignes d’adressage supplémentaires,
destinées à permettre l’identification d’un composant individuel. En
d’autres termes, s’il y a q composants, on crée au moins log2 q lignes.
• On construit un circuit combinatoire capable de décoder les valeurs
présentes sur les lignes d’adressage supplémentaires, et de piloter le
composant identifié par ces valeurs. Les autres composants
n’effectuent alors aucune opération.
116
256 × 4
8
Exemple:
Mémoire 1K × 4
construite à partir de quatre
mémoires 256 × 4:
a
d
4
256 × 4



a0
a1
..
.
a8
a9



8
8
a
d

4

d0
d1
d2
d3


2
Circuit
de
contrôle
256 × 4
contrôle
8
a
d
4
256 × 4
8
a
d
4
φ
117
Exemple de contrôleur:
On suppose que chaque composant possède
• Une ligne CS (Chip Select) qui spécifie si le composant doit effectuer
une opération (valeur 0), ou bien rester inactif (valeur 1).
• Une ligne WE (Write Enable) qui précise le type d’opération souhaitée
(écriture: 0, lecture: 1).
a8
a9
CS
CS0
WE0
CS1
WE1
CS2
WE2
CS3
WE3
WE
118
Le stockage de données sur plus d’une cellule
Quelle que soit la taille de cellule de la mémoire centrale d’un ordinateur,
on est parfois amené à devoir retenir des données de plus grande taille.
Une solution naturelle à ce problème consiste à stocker la valeur dans
plusieurs cellules situées à des adresses consécutives. Il y a cependant
deux possibilités:
• Placer le groupe de bits possédant le plus petit poids à la plus petite
adresse (représentation petit-boutiste).
• Placer le groupe de bits possédant le plus grand poids à la plus petite
adresse (représentation gros-boutiste).
119
Exemple: Représentation du nombre 0x12345678 sur 32 bits:
• Représentation petit-boutiste:
Adresse :
0
1
2
3
0x78 0x56 0x34 0x12
• Représentation gros-boutiste:
Adresse :
0
1
2
3
0x12 0x34 0x56 0x78
120
Les types de mémoire vive
On rencontre plusieurs variantes de mémoire vive:
• La mémoire statique: Cette mémoire est constituée de circuits
analogues aux flip-flops. Elle est très rapide, mais coûteuse et
gourmande en énergie.
• La mémoire dynamique: Cette mémoire retient des informations sous
la forme de charges électrostatiques devant être régulièrement
rafraı̂chies. Ses avantages résident dans un coût modéré et une faible
consommation d’énergie.
• La mémoire non volatile: Cette mémoire est capable de préserver les
données qu’elle contient même lorsqu’elle n’est pas alimentée.
121
La mémoire morte
Ce type de mémoire, aussi appelé ROM (Read-Only Memory), possède les
caractéristiques suivantes:
• La lecture de données présentes en mémoire peut être effectuée à
volonté.
• L’écriture de données n’est pas possible au cours de l’utilisation
normale du composant.
• Les données mémorisées sont préservées même lorsque le composant
est hors-tension.
La mémoire morte sert à retenir des programmes et des données.
122
L’organisation de la mémoire morte
La principale différence entre la structure d’une mémoire morte et celle
d’une mémoire vive est que le circuit de la première est combinatoire,
alors que celui de la seconde est séquentiel.
Une mémoire morte m × n possède la forme suivante:



a0
a1
..
.
ap−1
2p × n



p
a

d
n


d0
d1
..
.
dn−1



contrôle
• a0, a1, . . . , ap−1 sont des lignes d’adressage permettant d’identifier la
cellule à lire.
• d0, d1, . . . , dn−1 sont des lignes de sortie sur lesquelles la mémoire place
la valeur lue à l’adresse spécifiée.
123
• La ligne de contrôle permet de préciser l’opération devant être
effectuée: lecture ou absence d’opération.
Le fonctionnement de la mémoire morte est simple:
• Si l’entrée de contrôle est activée, le composant place sur les lignes de
sortie la valeur lue à l’adresse présente sur les lignes d’adressage, après
un certain délai de propagation des valeurs.
• Si l’entrée de contrôle n’est pas activée, les lignes de sortie sont à
haute impédance.
124
La combinaison de mémoires mortes
La combinaison de plusieurs mémoires mortes s’effectue de façon similaire
à la combinaison de mémoires vives. Il est également possible de combiner
des mémoires mortes et des mémoires vives au sein d’un même circuit.
Exemple: Mémoire 1K × 4 construite à partir d’une mémoire morte
256 × 4 et de trois mémoires vives 256 × 4:
• Un quart des cellules de cette mémoire composite appartiennent à la
mémoire morte (les adresses de ces cellules dépendent du circuit de
contrôle).
• Les autres cellules sont situées en mémoire vive.
125
256 × 4
8
a
d
4
256 × 4



a0
a1
..
.
a8
a9

8


2
8
a
d
4
d0
d1
d2
d3
!
Circuit
de
contrôle
256 × 4
contrôle
8
a
d
4
256 × 4
8
.
φ
a
d
4
.
126
Les types de mémoire morte
Il existe plusieurs variantes de mémoire morte:
• La mémoire non programmable: Le contenu de cette mémoire est fixé
lors de la fabrication du composant.
• La mémoire PROM (Programmable ROM): Le contenu de chaque
cellule peut être choisi par l’utilisateur (une seule fois !) avant la mise
en service du composant.
• La mémoire EPROM (Erasable PROM): Cette mémoire est similaire à
une PROM, mais son contenu peut être effacé en exposant le
composant à une lumière ultraviolette intense.
127
• La mémoire EEPROM (Electrically Erasable PROM): Il s’agit d’une
PROM dont le contenu peut être effacé électriquement.
• La mémoire Flash: Cette mémoire est similaire à l’EEPROM, mais
impose des restrictions sur les modalités d’effacement des cellules.
128
La mémoire de masse
Les données mémorisées en mémoire vive doivent pouvoir être consultées
et modifiées très rapidement. Le coût des mémoires vives rapides est
toutefois relativement important.
Pour cette raison, on dote également les ordinateurs d’une mémoire de
masse, de capacité supérieure à celle de la mémoire vive, mais de vitesse
d’accès nettement inférieure.
Dans la majorité des ordinateurs modernes, la mémoire de masse est
constituée de disques durs. Un disque dur est un empilement de plateaux
magnétiques fixés sur un même axe. Des têtes de lecture/écriture placées
en regard de chaque face de plateau assurent le transfert des informations
vers et depuis le disque. Toutes les têtes se déplacent solidairement au
gré du mouvement d’un bras de lecture/écriture.
129
La structure d’un disque dur
Les données mémorisées sur un disque dur sont structurées de la façon
suivante:
• Chaque face de plateau possède un certain nombre de pistes
concentriques sur lesquelles sont enregistrées les données.
• L’ensemble des pistes pouvant être atteintes par une position donnée
du bras forme un cylindre.
• Chaque piste se décompose en secteurs angulaires dont le contenu
constitue l’unité d’information élémentaire du disque.
Pour accéder à une donnée du disque, il suffit donc d’en préciser les
numéros de cylindre, de tête et de secteur.
130
Illustration:
Plateau
Secteur
Piste
Tête de lecture/écriture
Bras
131
Les bus de communication
Un bus est un ensemble de lignes de communication reliant plusieurs
circuits de l’ordinateur.
Les bus sont présents à plusieurs niveaux d’abstraction:
• Des bus internes relient les différentes unités fonctionnelles d’un
processeur.
• Des bus externes relient le processeur, la mémoire (principale et de
masse) et les composants auxiliaires.
• Des bus peuvent également relier plusieurs ordinateurs, ou un
ordinateur à ses périphériques.
132
Les caractéristiques d’un bus
Considérons le bus reliant le processeur à la mémoire centrale et à
d’autres composants.
Ce bus prend la forme de câbles souples connectés aux différents circuits,
ou bien d’un fond de panier rigide:
Par rapport aux circuits digitaux que nous avons étudiés, les bus
possèdent les particularités suivantes:
• Ils peuvent connecter un nombre élevé de circuits.
• Les distances entre les circuits peuvent être importantes.
133
La transmission de signaux via un bus
L’envoi de signaux vers une ligne de bus s’effectue via un composant
particulier, la porte à trois états:
c
d
q
• Si c = 1, la valeur d’entrée d est transmise à la sortie q.
• Si c = 0, la sortie est mise à haute impédance.
De même, la réception de signaux depuis une ligne de bus s’effectue via
un composant spécial, le tampon d’entrée (bus buffer).
Une porte à trois états et un tampon d’entrée peuvent être regroupés en
un émetteur-récepteur de bus (bus transceiver).
134
La forme générale de connexion d’un circuit à un bus est la suivante:
Bus
...
i1
q1
c1
i2
q2
c2
i3
q3
c3
Circuit
135
La discipline de bus
Les distances entre les circuits reliés par un bus peuvent être importantes.
Par conséquent, il est nécessaire de tenir compte de la vitesse de
propagation finie des signaux transmis.
Afin que les valeurs booléennes transmises sur une ligne de bus soient
toujours correctement décodées, on place un signal d’horloge sur une ligne
du bus (celui-ci est alors dit synchrone), et on impose la discipline
suivante:
• Les valeurs placées sur le bus doivent être stables avant un des deux
flancs de l’horloge (flanc d’assertion), et ne peuvent pas changer de
valeur jusqu’au flanc suivant (flanc d’échantillonnage).
• Les valeurs présentes sur le bus ne sont lues qu’au moment du flanc
d’échantillonnage.
136
Illustration de la discipline de bus:
Assertion
Echantillonnage
Horloge φ
Sorties de circuit q
137
Les transactions
Une transaction est une opération élémentaire de transfert de données
entre deux circuits connectés à un bus.
A un instant donné, il ne peut y avoir qu’au plus une transaction en cours
sur un bus.
Exemple: Une façon simple de coordonner les transactions consiste à
utiliser deux lignes de bus comme marqueurs:
• Une ligne start est activée par le circuit initiant la transaction (le
maı̂tre), et désactivée au coup d’horloge suivant.
• Une ligne stop est activée par l’autre circuit (l’esclave) dès qu’il
détecte la fin de la transaction, et désactivée au coup d’horloge
suivant.
Remarque: La distinction entre maı̂tre et esclave n’est pas liée au sens de
transfert des données, et peut différer d’une transaction à une autre.
138
Déroulement d’une transaction:
φ
start
stop
Données
Transaction
139
L’arbitration
Il est important de garantir que deux circuits ne puissent pas initier
simultanément une transaction sur un même bus.
Dans des configurations simples, une solution immédiate consiste à ne
connecter au bus qu’un seul circuit capable de jouer le rôle d’un maı̂tre.
S’il est nécessaire de connecter plusieurs maı̂tres potentiels, il faut alors
disposer d’un arbitre chargé de coordonner les accès au bus.
L’arbitre peut être
• centralisé, c’est-à-dire constitué d’un seul circuit connecté à tous les
composants, ou bien
• distribué, c’est-à-dire composé de plusieurs modules associés chacun à
un composant.
140
Exemple: Circuits avec arbitre centralisé:
Bus
...
i1
q1
c1
r1
c1
i2
Circuits
q2
c2
r2
c2
c3
Arbitre
i3
q3
c3
r3
141
Le processeur
Le processeur, ou unité centrale (Central Processing Unit, CPU), est au
cœur de tout système informatique.
Son rôle consiste à exécuter des programmes présents en mémoire vive ou
morte.
Ces programmes sont exprimés sous la forme de code machine, formé
d’une suite d’instructions placées à des adresses données, et codées grâce
à un schéma particulier.
L’exécution d’une instruction se déroule en trois phases: L’instruction est
chargée depuis la mémoire, puis décodée en une opération à effectuer, et
enfin cette opération est exécutée.
L’ensemble des instructions disponibles et leur schéma de traduction en
code machine sont des caractéristiques propres à chaque famille de
processeurs.
142
La structure d’un processeur
De façon générale, un processeur est un circuit séquentiel et possède donc
la structure suivante:
Sorties o1 , o2 , . . .
Circuit
Entrées i1 , i2 , . . .
combinatoire
n
n
n
d
q
n
φ
Les registres de ce circuit appartiennent à deux catégories:
• Les registres de données sont destinés à retenir les valeurs manipulées
lors de l’exécution des instructions, et le résultat des opérations.
• Les registres de contrôle servent à organiser le chargement, le
décodage et l’exécution des instructions.
143
Parmi les registres de contrôle, on distingue
• Un compteur de programme (Program Counter, PC) contenant
l’adresse de la prochaine instruction à charger.
• Un registre d’instruction contenant le code machine de l’instruction en
cours d’exécution (ou sur le point de s’exécuter).
La forme exacte des registres et leur nombre diffèrent d’une architecture à
une autre.
144
La séparation entre contrôle et données
La distinction entre contrôle et données peut être étendue à l’ensemble du
processeur. Celui-ci prend alors la forme suivante:
Lignes de contrôle
Lignes d’état
Traitement
du contrôle
Sorties
Traitement
des données
Registre(s)
Registre(s)
de contrôle
de données
Entrées
φ
145
La communication entre les deux parties est assurée par
• Des lignes de contrôle pilotant le circuit de données en spécifiant la
nature des opérations à effectuer.
• Des lignes d’état permettant aux valeurs calculées par le circuit de
données d’influencer le déroulement des programmes.
146
Le circuit de données (exemple)
c
c
φ
A
φ
B
φ
Lignes
ALU
c
c
d’état
Banque de
registres
c
Bus
interne
...
φ
c
Gestionnaire
de bus
Bus
externe
147
Le bus interne: Il assure la communication entre les différentes unités du
circuit.
L’unité arithmétique et logique (Arithmetic and Logic Unit, ALU): Cette
unité est capable d’effectuer une variété d’opérations, spécifiées par des
lignes de contrôle.
Le résultat d’une opération peut être placé sur le bus interne. Des valeurs
sont également générées sur des lignes d’état.
Les opérandes utilisées par l’ALU sont retenues dans deux registres A et B
pouvant être chargés depuis le bus interne.
La banque de registres: Elle peut être vue comme une mémoire vive de
faible capacité, à grande vitesse d’accès. Les données lues et écrites dans
cette mémoire, ainsi que leurs adresses, transitent par le bus interne.
Les opérations de la banque de registres sont pilotées par des lignes de
contrôle.
148
Le gestionnaire de bus: Il assure la liaison entre le bus interne du
processeur et le ou les bus externes servant à relier celui-ci aux autres
composants de l’ordinateur.
Ses opérations sont pilotées par des lignes de contrôle.
149
Le circuit de contrôle
Exemple de circuit de contrôle simple:
Bus
interne
...
c
φ
c
PC
φ
RI
Logique
interruptions
Lignes d’état
c
φ
c
de contrôle
Autres registres
de contrôle
φ
150
L’exécution d’un programme s’effectue en répétant les opérations
suivantes:
1. Le circuit place sur les lignes de contrôle des valeurs correspondant
• à une lecture en mémoire centrale à l’adresse PC , et
• à un chargement de la valeur lue dans le registre d’instruction.
2. Le circuit décode l’instruction dont le code machine se trouve dans le
registre d’instruction, et met à jour la valeur de PC .
3. Pendant un certain nombre de cycles d’horloge, le circuit génère sur
les lignes de contrôle des valeurs pilotant le circuit de données, afin
d’exécuter les opérations requises par l’instruction courante.
151
Les interruptions
Le séquencement des instructions exécutées par le processeur ne doit pas
être uniquement déterminé par le code machine présent en mémoire.
En effet, dans certaines circonstances, l’exécution d’un programme doit
parfois être interrompue afin de permettre au processeur d’effectuer des
opérations urgentes.
Dans ce but, le circuit de contrôle est doté d’une ou de plusieurs entrées
d’interruption. L’activation de ces entrées interrompt le flux normal des
instructions, et transfère le contrôle à un segment de programme
particulier (la routine d’interruption).
Lors d’une interruption, l’état du processeur doit être sauvegardé afin de
permettre au programme interrompu de reprendre son exécution à la fin
de l’interruption. Selon l’architecture du processeur, cette sauvegarde est
soit automatique, soit réalisée par la routine d’interruption.
152
Les différentes architectures
L’architecture des processeurs modernes s’inspire du processeur simple
que nous venons de décrire, mais y ajoute souvent un certain nombre de
caractéristiques supplémentaires:
• Les processeur RISC (Reduced Instruction-Set Computer): Le jeu
d’instructions est réduit, mais toutes les instructions possèdent un
code machine de même longueur. Cela permet de simplifier le circuit
de contrôle, et de rendre le processeur plus rapide.
• Les processeurs vectoriels: Ceux-ci possèdent plusieurs circuits de
données ou plusieurs unités arithmétiques, capables d’effectuer des
opérations simultanément.
• Les processeurs multicœur (multicore): Ils sont dotés de plusieurs
circuits de contrôle leur permettant d’exécuter simultanément
différentes séquences d’instructions.
153
Chapitre 4
Les instructions et les programmes
154
L’architecture 80x86
La famille 80x86 regroupe une gamme étendue de processeurs: 8088,
8086, 80186, 80286, 80386, 80486, Pentium, Pentium III, Pentium IV,
Xeon, Core 2, Atom, i3, i5, i7, . . . .
Il existe une forte compatibilité ascendante entre ceux-ci: la plupart des
programmes écrits pour un de ces processeurs peuvent être correctement
exécutés par n’importe quel processeur plus récent.
Dans le cadre de ce cours, nous étudierons seulement une fraction
essentielle de la structure et du jeu d’instructions des processeurs 80x86,
et nous nous limiterons aux éléments communs à tous les membres de
cette famille.
155
Le modèle mémoire
Les processeurs 80x86 sont capables d’adresser directement la mémoire
principale.
Cet adressage est effectué de façon segmentée: Un segment est un
ensemble de cellules contiguës utilisées dans le même but.
Chaque programme définit plusieurs segments:
• Un segment de code contenant les instructions du programme;
• Un segment de pile contenant certaines données temporaires.
L’application principale de ce segment consiste à retenir l’adresse de
retour lors d’un appel de sous-routine;
• Un ou plusieurs segments de données contenant les valeurs d’entrée et
de sortie du programme, ainsi que des résultats intermédiaires.
156
Pour accéder à une cellule de la mémoire principale, il est nécessaire de
fournir
• Un identificateur de segment, c’est-à-dire une valeur numérique
spécifiant à quel segment appartient la cellule;
• Un déplacement, ou offset, qui représente la différence d’adresses
entre la cellule et la base du segment qui la contient.
Mémoire
Seg.1
id.
Seg.2
offset
157
L’alignement
La taille de cellule de la mémoire adressée par un processeur 80x86 est
fixée à 8 bits.
Cela ne signifie pas qu’il est impossible de transférer plus de 8 bits en une
seule opération de la mémoire: Le bus externe possède souvent 32 ou 64
lignes de données.
Cependant, un transfert efficace n’est possible qu’à condition que les
données soient convenablement alignées: Une valeur stockée sur N octets
(avec N = 2, 4 ou 8) ne peut être transférée en une seule opération que si
son adresse est un multiple de N .
Remarque: Certaines architectures (par exemple, la famille MIPS R4000)
ne permettent pas le transfert de données non alignées.
158
Les registres
Les registres d’un processeur 80x86 peuvent être classés en trois
catégories.
Les registres généraux
Il peuvent être utilisés comme opérandes de la plupart des instructions du
processeur. Ils sont 8, et possèdent chacun une capacité de 16 bits: AX,
BX, CX, DX, SI, DI, SP, BP.
Les deux octets constituant chacun des registres AX, BX, CX et DX
peuvent aussi être utilisés séparément; ces sous-registres de 8 bits sont
dénotés AH, AL, BH, BL, CH, CL, DH et DL. Le suffixe H correspond au
poids fort (High), le suffixe L au poids faible (Low).
Certains registres généraux sont également utilisés par des opérations
spécifiques.
159
Les registres de segment
Ceux-ci contiennent les identificateurs des différents segments utilisés par
le programme exécuté. Ils sont 4, et possèdent chacun une capacité de 16
bits: CS, DS, SS, ES.
Leur contenu est interprété de la façon suivante:
CS
SS
DS, ES
:
:
:
Segment de code;
Segment de pile;
Segments de données.
Les registres de statut et de contrôle
Il sont deux, et contiennent chacun 16 bits:
• Le registre IP (Instruction Pointer) contient l’offset dans le segment
de code de la prochaine instruction à exécuter;
• Le registre FLAGS contient des drapeaux fournissant des informations
sur le résultat d’une opération précédemment exécutée.
160
Les drapeaux les plus utiles sont situés aux positions suivantes du registre
FLAGS:
0
:
CF
2
:
PF
6
7
:
:
ZF
SF
11
:
OF
Indique un report survenu au cours d’une opération
arithmétique;
Est positionné si l’octet de poids faible d’un résultat
possède un nombre pair de bits égaux à 1;
Indique un résultat nul;
Indique un résultat négatif (en utilisant la représentation
par complément à 2 des nombres signés);
Signale un dépassement arithmétique.
161
Les instructions
Une instruction d’un programme est caractérisée par trois informations:
• Son adresse. Elle peut être donnée par un offset dans le segment de
code, ou implicitement si l’instruction suit immédiatement l’instruction
précédente;
• Son code d’opération, ou opcode. Celui-ci est le plus souvent donné
par une courte dénomination conventionnelle, la mnémonique;
• Ses opérandes: Celles-ci précisent quels sont les paramètres de
l’opération. L’architecture 80x86 permet une grande variété de formes
d’opérandes.
Pour une opération possédant deux opérandes et exprimant un
transfert de données, la deuxième opérande correspond à l’origine et la
première à la destination des données.
162
Les modes d’adressage
Un mode d’adressage correspond à une forme d’opérande admise par
l’architecture du processeur.
Toutes les instructions ne sont pas capables d’exploiter l’ensemble des
modes d’adressage disponibles. Pour chaque mode que nous allons
décrire, nous donnerons
• la syntaxe associée à l’emploi de ce mode, et
• un code destiné à identifier ce mode d’adressage.
Lors de la présentation des différentes instructions, nous utiliserons ce
code pour associer à chaque instruction l’ensemble des modes
d’adressage permis pour ses opérandes.
163
L’adressage registre
Définition: L’opérande est contenue dans un des registres généraux.
Notation et exemples: L’instruction
mov al, ah
dénote une opération de transfert d’un octet depuis le registre AH vers le
registre AL.
L’instruction
mov ax, dx
dénote une opération de transfert de deux octets depuis le registre DX
vers le registre AX.
Code conventionnel: r8 ou r16, selon la taille de l’opérande.
164
L’adressage immédiat
Définition: L’opérande est constante et sa valeur accompagne
l’instruction.
Notation et exemple: L’instruction
mov ax, 1234h
dénote une affectation de la valeur constante 0x1234 au registre AX.
Code conventionnel: i8 ou i16, selon la taille de l’opérande.
165
L’adressage direct
Définition: L’opérande est placée en mémoire principale, dans le segment
de données, à un offset spécifié.
Notation et exemple: L’instruction
mov al, [100h]
dénote une opération de transfert de données depuis l’octet situé à l’offset
0x100 du segment de données principal (identifié par le contenu de DS)
vers le registre AL.
Note: Le nombre (8 ou 16) de bits adressés peut être spécifié par un
qualificateur byte ou word. Exemple:
mov word [100h], 0
Code conventionnel: m8 ou m16, selon la taille de l’opérande.
166
L’adressage indirect
Définition: L’opérande est placée en mémoire principale, dans le segment
de données, à un offset égal au contenu d’un des registres BX, BP, SI, ou
DI.
Il est également possible de spécifier un décalage constant à ajouter à la
valeur du registre utilisé pour l’adressage indirect.
Notation et exemples: L’instruction
mov al, [bx]
dénote le transfert d’un octet depuis l’offset du segment de données égal
à la valeur du registre BX vers le registre AL.
L’instruction
mov cx, [bx + 6]
dénote le transfert de deux octets depuis l’offset (BX + 6) du segment de
données vers le registre CX.
Code conventionnel: p8 ou p16, selon la taille de l’opérande.
167
L’adressage indirect indexé
Définition: L’opérande est placée en mémoire principale, dans le segment
de données, à un offset égal à la somme d’un des registres BX ou BP et
d’un des registres SI ou DI.
Il est également permis de spécifier un décalage constant s’ajoutant à
cette somme.
Notation et exemples: L’instruction
mov cx, [bx + si]
dénote le transfert de deux octets depuis l’offset (BX + SI) du segment de
données vers le registre CX.
168
L’instruction
mov ah, [bx + di - 4]
dénote le transfert d’un octet depuis l’offset (BX + DI − 4) du segment de
données vers le registre AH.
Code conventionnel: p8 ou p16 (on fusionne ce mode avec l’adressage
indirect).
169
Les instructions de transfert
L’instruction MOV:
Effectue un transfert de sa deuxième opérande vers sa première. Les
drapeaux ne sont pas modifiés.
Les modes d’adressage autorisés sont:
Op.1
rα
mα
rα
pα
Op.2
rα
rα
mα
rα
Op.1
rα
rα
pα
mα
Op.2
pα
iα
iα
iα
(Le code α indique que les tailles 8 et 16 sont toutes deux permises.)
Exemple: L’instruction
mov [BX + SI], 1234h
affecte la valeur 0x1234 au groupe de deux octets situés à l’offset
(BX + SI) du segment de données.
170
L’instruction XCHG:
Echange la valeur de ses deux opérandes. Les drapeaux ne sont pas
modifiés.
Les modes d’adressage autorisés sont:
Op.1
rα
mα
pα
rα
rα
Op.2
rα
rα
rα
mα
pα
171
Les instructions d’accès à la pile
Principes:
• La pile est stockée dans le segment de pile (registre SS);
• La pile croı̂t dans la direction des adresses décroissantes;
• L’offset de l’élément situé au sommet de la pile est égal au contenu
du registre SP.
Segment
de
pile
SP
Pile
172
L’instruction PUSH:
Prend une opérande de 16 bits et place la valeur de celle-ci sur la pile.
Cette opération s’effectue en deux étapes:
1. La valeur du registre SP est décrémentée de deux unités afin de
réserver une place en mémoire pour le nouvel élément.
2. La valeur de l’opérande est transférée dans le segment de pile, à
l’offset donné par la nouvelle valeur de SP.
Les drapeaux ne sont pas modifiés. Les modes d’adressage autorisés sont:
Op.1
r16
m16
i16
173
L’instruction POP:
Extrait de la pile une valeur de 16 bits et la transfère dans son opérande.
Cette opération s’effectue en deux étapes:
1. La valeur située dans le segment de pile à l’ offset donné par la valeur
de SP est transférée dans l’opérande;
2. Le registre SP est incrémenté de deux unités afin de le faire pointer
vers le nouveau sommet de la pile.
Les drapeaux ne sont pas modifiés. Les modes d’adressage autorisés sont:
Op.1
r16
m16
174
Les instructions arithmétiques
L’instruction ADD:
Calcule la somme de ses deux opérandes et place le résultat dans la
première.
Les drapeaux CF, PF, ZF, SF et OF sont mis à jour à l’aide du résultat
de l’opération.
Les modes d’adressage autorisés sont:
Op.1
rα
mα
rα
pα
r16
m16
Op.2
rα
rα
mα
rα
i8
i8
Op.1
rα
rα
pα
mα
p16
Op.2
pα
iα
iα
iα
i8
175
L’instruction SUB:
Retranche la valeur de la deuxième opérande de la valeur de la première,
et place le résultat dans la première opérande.
Les drapeaux CF, PF, ZF, SF et OF sont mis à jour à l’aide du résultat
de l’opération.
Les modes d’adressage permis sont identiques à ceux de l’instruction
ADD.
L’instruction CMP:
Effectue la même opération de soustraction que l’instruction SUB, mais
ne place pas le résultat dans la première opérande.
L’effet de l’opération est donc uniquement reflété par la valeur des
drapeaux.
Cette instruction permet donc de comparer deux valeurs, dans le but de
prendre ensuite une décision basée sur la valeur des drapeaux.
176
L’instruction INC:
Ajoute 1 à son opérande, en mettant à jour les drapeaux OF, PF, SF et
ZF (mais pas CF).
Les modes d’adressage autorisés sont:
Op.1
rα
mα
pα
L’instruction DEC:
Soustrait 1 à son opérande.
Les modes d’adressage permis et les drapeaux mis à jours sont identiques
à ceux de l’instruction INC.
177
L’instruction MUL:
Multiplie deux nombres non signés. Cette instruction possède une seule
opérande, dont la taille détermine l’opération effectuée:
• Opérande de 8 bits. L’opérande est multipliée par AL et le résultat est
placé dans AX.
Les drapeaux CF et OF sont mis à 0 si la nouvelle valeur de AH est
nulle, et à 1 sinon;
• Opérande de 16 bits. L’opérande est multipliée par AX, et le résultat
est placé dans les deux registres DX (poids fort) et AX (poids faible).
Les drapeaux CF et OF sont mis à 0 si la nouvelle valeur de DX est
nulle, et à 1 sinon.
Les modes d’adressage permis sont identiques à ceux des instructions INC
et DEC.
178
Les instructions logiques
Les instructions AND, OR et XOR:
Appliquent les opérations booléennes correspondantes bit par bit à leurs
deux opérandes, et placent le résultat dans la première.
Les drapeaux PF, ZF et SF sont mis à jour.
Les modes d’adressage autorisés sont identiques à ceux d’une instruction
ADD ou SUB.
L’instruction NOT:
Inverse la valeur de chaque bit de son opérande, sans modifier les
drapeaux.
Les modes d’adressage permis sont identiques à ceux de l’instruction
MUL.
179
Les instructions de contrôle
Ces instructions permettent de modifier le séquencement normal d’un
programme, en transférant le contrôle à un point donné ou calculé de
celui-ci.
Lorsque le contrôle est transféré en mémorisant une adresse de retour, on
parle d’un appel de sous-routine. Sinon, il s’agit d’un saut.
L’instruction JMP:
Provoque un saut inconditionnel vers un offset du segment de code donné
par son opérande. Les drapeaux ne sont pas modifiés.
Les modes d’adressage permis sont:
Op.1
i16
r16
m16
p16
180
Les instructions de saut conditionnel:
Elles sont similaires à l’instruction JMP, mais n’effectuent un saut que si
une condition particulière est satisfaite.
Dans le cas contraire, l’exécution du programme se poursuit à l’instruction
suivante.
La condition s’exprime en fonction des drapeaux, ou bien des opérandes
d’une instruction CMP précédemment exécutée.
Instr.
Condition de saut
JC
JNC
JZ
JNZ
JO
JNO
JE
JNE
JG
JGE
JL
JLE
JA
JAE
JB
JBE
CF = 1
CF = 0
ZF = 1
ZF = 0
OF = 1
OF = 0
Op1 = Op2
Op1 6= Op2
Op1 > Op2
Op1 ≥ Op2
Op1 < Op2
Op1 ≤ Op2
Op1 > Op2
Op1 ≥ Op2
Op1 < Op2
Op1 ≤ Op2
(valeurs
(valeurs
(valeurs
(valeurs
(valeurs
(valeurs
(valeurs
(valeurs
signées)
signées)
signées)
signées)
non signées)
non signées)
non signées)
non signées)
181
Exemple:
Les deux instructions
cmp ax, bx
jge 1234h
provoquent un saut à l’offset 0x1234 du segment de code à la condition
que la valeur de AX soit au moins égale à la valeur de BX, les deux
nombres étant considérés signés.
182
L’instruction LOOP:
Possède une opérande dont le mode d’adressage est identique à celle
d’une instruction JMP.
Cette instruction décrémente d’une unité la valeur du registre CX, sans
affecter la valeur des drapeaux.
Si la nouvelle valeur de CX est non nulle, alors l’instruction effectue un
saut vers l’offset spécifié par son opérande.
La principale application de l’instruction LOOP est d’implémenter
l’itération d’opérations. Pour répéter n fois une partie de code, il suffit en
effet:
• De placer l’instruction LOOP à la fin de ce code, et de la doter d’une
opérande pointant vers le début de celui-ci;
• De charger n dans le registre CX et d’effectuer un saut vers le début
du code.
183
L’instruction CALL:
Effectue un appel de sous-routine. Ses modalités d’utilisation et ses
modes d’adressage sont identiques à ceux de l’instruction JMP.
A la différence de cette dernière, l’instruction CALL mémorise sur la pile
l’offset (dans le segment de code) de l’instruction qui la suit. Cette
adresse de retour permettra de reprendre l’exécution du programme une
fois l’appel de la sous-routine terminé.
L’instruction RET:
Marque la fin de l’exécution d’une sous-routine. Elle a pour effet de
récupérer une valeur de retour sur la pile (préalablement placée par une
instruction CALL), et d’effectuer un saut vers cet offset.
184
Le langage d’assemblage
Dans la mémoire de l’ordinateur, les programmes sont présents sous forme
de code machine.
Le langage d’assemblage (ou assembleur) constitue une forme lisible de
code machine. Un programme exprimé dans ce langage peut être
directement traduit en code machine (par un programme d’assemblage).
Les mnémoniques et la syntaxe des modes d’adressage qui ont été
introduits dans ce chapitre étaient déjà exprimées en langage
d’assemblage.
Ce langage offre également des facilités au programmeur: définitions de
segments, de valeurs symboliques, . . .
185
La structure d’un programme
Un programme assembleur peut être composé de plusieurs sections
définissant chacune le contenu d’un segment.
Principes:
• La définition du segment de données principal (associé à DS), est
précédée de
SECTION .data
• La définition du segment de code (contenant les instructions), est
précédée de
SECTION .text
Les segments sont alors placés en mémoire et des valeurs sont attribuées
aux registres de segments par le programme d’assemblage.
186
Les étiquettes
Lors de la définition d’une instruction de saut ou d’appel de sous-routine,
il est peu commode d’obliger le programmeur à spécifier explicitement
l’offset dans le segment de code du code invoqué.
Le langage d’asemblage permet de spécifier cet offset symboliquement, en
désignant la destination du branchement par une étiquette.
Lors de l’assemblage, les étiquettes présentes dans le programme sont
automatiquement remplacées par l’offset des instructions auxquelles elles
sont associées.
Exemple et notation:
mov
boucle : mov
...
inc
loop
cx, 0Ah
ah, [bx + si]
si
boucle
187
La réservation de mémoire
En général, les registres du processeur ne suffisent pas à retenir les
données temporaires devant être manipulées par les programmes.
On est alors amené à reserver des cellules dans le segment de données,
destinées à retenir ces données.
Ces réservations peuvent être effectuées par les directives db (8 bits) et dw
(16 bits). Ces directives peuvent être précédées d’une étiquette
permettant d’y faire référence symboliquement.
Exemple:
SECTION
premier db
deuxieme db
SECTION
...
mov
cmp
...
.data
3
−2
.text
al, [premier]
al, [deuxieme]
188
Remarque: Les directives db et dw garantissent un bon alignement des
données pour l’ensemble des opérations de transfert de données.
189
La définition de constantes
Il est souvent pratique de spécifier symboliquement la valeur de constantes
utilisées à de nombreux endroits d’un programme.
Une telle définition de constante ne nécessite pas de réservation de
mémoire dans le segment de données.
La directive equ permet de définir des symboles dont la valeur sera
substituée au moment de la traduction du programme en code machine.
Exemple et notation:
nombre
equ 10
...
mov cx, nombre
boucle : . . .
loop boucle
...
190
Téléchargement