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