0% ont trouvé ce document utile (0 vote)
200 vues57 pages

Cours LMD

Transféré par

Lisa Lisa lili
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
200 vues57 pages

Cours LMD

Transféré par

Lisa Lisa lili
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Programme du 3ème semestre, 2ème année LMD en Informatique

Promotion 2020 – 2021 Université Mouloud MAMMERI de TIZI OUZOU

Programme ministériel
Chapitre I
‐ Introduction à la notion d’architecture des ordinateurs
‐ Architectures de Von Neumann et de Harvard
Chapitre II Principaux composants d’un ordinateur
‐ Schéma global d’une architecture
‐ Le processeur
o L’unité de commande
o UAL, Séquenceur, Compteur Ordinal
o Les bus
o Les registres
o L’Horloge
‐ La mémoire interne : mémoire RAM (SRAM et DRAM), temps d’accès, latence, …
‐ Hiérarchie mémoire
‐ La mémoire cache : utilité et principe, algorithmes de gestion du cache (notions de base)
Chapitre III : Notions sur les instructions d’un ordinateur
‐ Langage de haut niveau, assembleur, langage machine
‐ Les instructions machines usuelles (arithmétiques, logiques, de comparaison,
chargement, rangement, transfert, sauts, …)
‐ Principe de compilation et d’assemblage (notions de base)
‐ Phases d’exécution d’une instruction (recherche, décodage, exécution, rangement des
résultats)
‐ UCC pipeline.
Chapitre IV : le processeur
‐ Rôle du processeur, calcul du CPI (Cycle per Instruction) moyen, les processeurs CISC
et RISC
‐ Le microprocesseur MIPS R3000
‐ Structure externe du processeur MIPS R3000
‐ Structure interne du processeur MIPS R3000
‐ Jeu d’instructions, Formats et programmation du MIPS R3000
‐ Programmation du MIPS R3000
Chapitre V : Instructions spéciales du MIPS R3000
‐ Notions sur les interruptions, les E/S et les instructions systèmes (cas du MIPS R3000)
 

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         1 
 
Chapitre I
I-1 – Introduction à la notion d’architecture des ordinateurs
L'architecture de l’ordinateur traite du comportement fonctionnel d'un système d’ordinateur
tel qu'il est vu par un programmeur. Cette vue comprend des aspects tels que la taille des types de
données (par exemple, l'utilisation de 32 chiffres binaires pour représenter un entier) et les types
d'opérations prises en charge (comme l'addition, la soustraction et les appels de sous-programmes).
L'organisation de l'ordinateur traite des relations structurelles qui ne sont pas visibles par le
programmeur, telles que les interfaces avec les périphériques, la fréquence d'horloge et la technologie
utilisée pour la mémoire. Il existe un concept de niveaux dans l'architecture de l’ordinateur. L'idée de
base est qu'il existe de nombreux niveaux, ou vues, auxquels un ordinateur peut être considéré, du
niveau le plus élevé, où l'utilisateur exécute des programmes, ou utilise l'ordinateur, au niveau le plus
bas, composé de transistors et de fils. Entre les niveaux haut et bas se trouvent un certain nombre de
niveaux intermédiaires. Le tableau suivant montre sept niveaux dans l'ordinateur, du niveau utilisateur
au niveau transistor. Au fur et à mesure que nous progressons du niveau supérieur vers le bas, les
niveaux deviennent moins «abstraits» et une plus grande partie de la structure interne de l'ordinateur
transparaît. Nous discutons de ces niveaux ci-dessous.

Niveau haut Niveau utilisateur : Programmes d’application


Langages de haut niveau
Langage d’assemblage / Code machine
Commande microprogrammée / câblée
Unités fonctionnelles (Mémoire, UAL,etc)
Portes logiques
Niveau bas Transistores et fils

TAB. I-1 Niveaux de machines dans la hiérarchie de l’ordinateur


L’étude de l’architecture d’un ordinateur englobe l’organisation hardware et les nécessités de
programmation. Du point de vue du langage assembleur, l’architecture de la machine se résume au
répertoire d’instructions qui inclut le code opération, les modes d’adressages, les registres, la mémoire
virtuelle etc. D’un point de vue implémentation hardware, la machine est organisée de CPUs, de
Caches, de Bus, de Microcodes, de Pipelines, de Mémoire physique etc ... Donc l’étude de
l’architecture couvre aussi bien les architectures de répertoires que les organisations hardwares
d’implémentation. Sur les quatre dernières décades, l’architecture a connu des évolutions et non des
changements révolutionnaires.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         2 
 
I-2 - Architectures de Von Neumann et de Harvard
Différences entre l'architecture de Von Neumann et l'architecture de Harvard

Processeur Mémoire de Programmes 
et Données.

Architecture Von Neumann

Mémoire programme Processeur Mémoire de données

Architecture Harvard
FIG. I-1 Différences entre l'architecture de Von Neumann et l'architecture de Harvard
De nos jours, l'audio et la vidéo sont totalement numérisés. Lorsque le signal audio est hors
d’une source audio ou d’un microphone, le signal analogique sera échantillonné, codé, modulé,
compressé et traité sous la forme numérique, ce processus est donc nommé DSP (Digital Signal
processing : traitement numérique du signal).
L'architecture Harvard, la plus populaire, est utilisée pour gérer des algorithmes DSP
complexes, et ces algorithmes sont utilisés dans les processeurs de machine RISC les plus courants
et avancés. Ici, nous présentons l'architecture de Von Neumann et l'architecture de Harvard.
Architecture Von Neumann
L’architecture Von Neumann a été publiée pour la première fois dans le rapport de John Von
Neumann le 30 juin 1945 et depuis lors, le même principe est utilisé dans les ordinateurs.
Application et fonctionnalités de l'architecture de Von Neumann
L'architecture Von Neumann a une application étendue dans la vie quotidienne et se compose
de quelques fonctionnalités importantes et ici nous aurons une élaboration détaillée des
fonctionnalités.
Mémoire : Nous savons tous que l’architecture Von Neumann n'est rien d'autre qu'un ordinateur
dotée de la fonction de stockage de données. Dans l'architecture Von Neumann, la mémoire joue un
rôle essentiel et est considérée comme l'une des caractéristiques importantes. Celle-ci est
principalement responsable de la conservation et du démarrage des données et des données de
programmation. Dans les temps modernes, elle a été remplacée par la RAM et maintenant nous
utilisons la RAM à cette fin.
Unité de contrôle : Cette unité est principalement responsable de l'aspect contrôle. Toutes les
données stockées dans la mémoire et pendant le traitement des données, l'unité de contrôle joue le
rôle et elle gère le flux de données. L'unité de contrôle suit le principe du un à la fois et traite en
conséquence toutes les données.
Entrée-sortie : Comme tous les appareils électroniques, l'architecture Von Neumann possède
également une architecture d'entrée/sortie. C'est la fonction de base qui est la même et rien de spécial

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         3 
 
n'a été conçu pour l'architecture d'entrée et de sortie. C’est avec le périphérique d'entrée et de sortie
qu’une personne peut communiquer.
ALU : UAL (l'Unité Arithmétique et Logique) a une grande importance dans l'architecture Von
Neumann. Toutes sortes d'addition, soustraction, multiplication et division des données seront
effectuées par cette UAL. En plus de cela, tout autre type de fonction et d'activités algorithmiques
seront exécutés par l'UAL. Ce sont les aspects de base de l'architecture Von Neumann dont vous
devez être conscient.

Mémoire 

Unité Entrée
Arithmétique et
Unité de Logique
Contrôle

Accumulateur Entrée

Processeur 

FIG. I-2 Caractéristiques de l'architecture Von Neumann

Architecture Harvard

L'architecture Harvard n'est rien d'autre qu'une sorte de stockage de données. En ce qui
concerne le stockage physique des données, l'architecture Harvard a toujours été la première. Bien
que le concept ne soit pas nouveau, l'architecture Harvard a toujours été très appréciée. L'ordinateur
à relais Harvard Mark I est le terme à partir duquel le concept de l'architecture Harvard émerge pour
la première fois, puis il y a eu un développement significatif avec cette architecture. La fonction
principale de cette architecture est de séparer et de stocker physiquement les données des
programmes.

UAL

Mémoire programme Unité de contrôle Mémoire de données

Entrées / Sorties

FIG. I-3 Architecture Harvard

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         4 
 
Application et fonctionnalités de l'architecture Harvard
L'architecture Harvard a une application étendue dans les produits de traitement audio et vidéo
et avec chaque instrument de traitement audio et vidéo, vous remarquerez la présence de l'architecture
Harvard. Les processeurs Blackfin d'Analog Devices, Inc. sont les dispositifs particuliers où elle a
une utilisation de premier ordre. L'architecture Harvard est également largement utilisée dans d'autres
produits basés sur des puces électroniques.
État de la mémoire
La mémoire programme exécute toutes les fonctions. Oui, il n'y aura que de la mémoire en
lecture seule et cette mémoire sera utilisée à des fins de lecture, de codage, de décodage et de stockage
des données secondaires. La deuxième mémoire, est la mémoire de données, dissociée de la mémoire
programme.
L'aspect vitesse
L’architecture Harvard a fait l’objet de nombreuses discussions, mais sans la rapidité, aucune
architecture ne peut être acceptée. Mais dans le cas de l'architecture Harvard, les fabricants ont conçu
l'architecture de manière à ce qu'elle puisse traiter les données avec une vitesse beaucoup plus élevée.
Oui, tout a été pris pour que l'architecture puisse traiter les données à grande vitesse.
En mettant en œuvre la même formule, les processeurs modernes sont fabriqués afin que le nouveau
processeur puisse fonctionner avec une vitesse beaucoup plus rapide et puisse également traiter les
données efficacement. Le concept du cache CPU est également mis en œuvre lors de la conception
de l'architecture Harvard.
Pourquoi l'architecture Harvard est-elle efficace ?
Après avoir tout vu, le fait qu'une question vous frappera certainement à l'esprit : pourquoi
l'architecture Harvard est si efficace ? La réponse est assez claire et simple : l'architecture est capable
de lire une instruction et elle peut également effectuer simultanément un accès à la mémoire de
données à une vitesse rapide. Par conséquent, l'architecture Harvard est largement acceptée.

Mémoire Bus @ MD  Mémoire de


Bus @ MP 
Programme Données
CPU
Et données
secondaires Bus
Données Cache  Bus Données seulement
instruction Données
MP
MD
Contrôleur d’E/S 

Données
FIG. I-4 Caractéristiques de l'architecture de Harvard

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         5 
 
Différence entre l'architecture de Von Neumann et celle de Harvard
Les caractéristiques et les spécifications des deux architectures sont discutées et la fonction
de base des deux architectures est de concevoir l'architecture d’un ordinateur. Cependant, dans
certains aspects, les deux architectures diffèrent l'une de l'autre et ici nous allons élaborer la différence
fondamentale entre l'architecture Von Neumann et celle de Harvard.
L’architecture Von Neumann est une sorte d'architecture qui est plus visible dans le cas du
processeur conventionnel et aujourd'hui également le même principe est mis en œuvre. Les PC, les
serveurs et les systèmes embarqués relèvent des processeurs conventionnels et traditionnels qui ne
fonctionnent qu'avec la fonction de contrôle et ici vous remarquerez l'architecture Von Neumann.
En revanche, l'architecture Harvard est présente dans le cas des processeurs modernes et les
plus récents comme les DSP et autres processeurs. En plus des systèmes de communication mobile
ci-dessus, les systèmes de traitement audio, de parole et d'image sont le lieu où vous trouverez
l'application de l'architecture Harvard.
Dans Von Neumann, les données et les programmes sont dans la même mémoire, mais dans le cas de
l'architecture Harvard, une mémoire séparée est utilisée aux fins ci-dessus. Par conséquent, dans le
stockage, l'aspect des données diffère l'une de l'autre.
Le codage diffère également dans l'architecture. Von Neumann est une sorte d'architecture où vous
constaterez que les codes sont exécutés en série et prennent plus de cycles d'horloge, alors que dans
le cas de Harvard, la même chose ne se produit pas. L'architecture Harvard suit un niveau de codage
parallèle.
Vous ne trouverez pas de nombre excessif de multiplicateurs dans le cas de l'architecture Von
Neumann, mais dans le cas de l'architecture Harvard vous trouverez un grand nombre de
multiplicateurs. En plus de cela, les deux architectures diffèrent l'une de l'autre dans divers aspects
tels que la présence d'un barrel shifter ou registre décaleur à barillet, l'optimisation de la
programmation, la vitesse de traitement et bien plus encore.
L'architecture Von Neumann est une conception d’ordinateur théorique basée sur le concept de
programme stocké où les programmes et les données sont stockés dans la même mémoire. Le concept
a été conçu par un mathématicien John Von Neumann en 1945 et sert actuellement de base à presque
tous les ordinateurs modernes. La machine Neumann se compose d'un processeur central avec une
unité arithmétique / logique et une unité de contrôle, une mémoire, une mémoire de masse et une
entrée et une sortie.
L'architecture Harvard est une architecture d’ordinateur avec un stockage physiquement séparé et des
chemins de signaux pour les instructions et les données. Le terme provient de l'ordinateur à relais
Harvard Mark I, qui stockait les instructions sur une bande perforée (24 bits de large) et les données
dans des compteurs électromécaniques. Certains exemples d'architectures Harvard impliquent les
premiers systèmes informatiques où l'entrée de programmation pouvait être sur un support, par
exemple, des cartes perforées, et les données stockées pourraient être sur un autre support. Les
ordinateurs plus modernes peuvent avoir des processus CPU modernes pour les deux systèmes, mais
les séparent dans une conception matérielle.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         6 
 
Caractéristiques de l'architecture Von Neumann
1. L'architecture Von Neumann est une conception théorique basée sur le concept d'ordinateur à
programme stocké.
2. L'architecture Von Neumann n'a qu'un seul bus qui est utilisé à la fois pour les extractions
d'instructions et les transferts de données. Plus important encore, l'opération doit être planifiée car
elle ne peut pas être effectuée en même temps.
3. Dans l'architecture Von Neumann, l'unité de traitement nécessiterait deux cycles d'horloge pour
terminer une instruction.
4. L'architecture Von Neumann est généralement utilisée littéralement dans toutes les machines, des
ordinateurs de bureau, des ordinateurs portables, des ordinateurs à hautes performances aux stations
de travail.
5. Dans Von Neumann, les instructions et les données utilisent le même système de bus, donc la
conception et le développement de l'unité de contrôle sont simplifiés, d'où le coût de production
devient minimum.
Caractéristiques de l'architecture Harvard
1. L'architecture Harvard est une architecture d’ordinateur moderne basée sur le modèle : le relais
Harvard Mark I.
2. L'architecture Harvard a un espace mémoire séparé pour les instructions et les données. Elle sépare
physiquement les signaux, le code de stockage et la mémoire de données, ce qui permet à son tour
d'accéder simultanément à chacun des systèmes de mémoire.
3. Dans l'architecture Harvard, l'unité de traitement peut exécuter une instruction en un cycle si des
plans de pipelining appropriés ont été définis.
4. L'architecture Harvard est un nouveau concept utilisé spécifiquement dans les microcontrôleurs et
le traitement numérique du signal (DSP : Digital Signal Processing).
5. L'architecture Harvard est un type d'architecture complexe car elle utilise deux bus pour
l'instruction et les données, un facteur qui rend le développement de l'unité de contrôle
comparativement plus coûteux.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         7 
 
Architecture Von Neumann vs Architecture de Harvard sous forme tabulaire

BASE DE COMPARAISON ARCHITECTURE VON NEUMANN ARCHITECTURE HARVARD

Description L'architecture Von Neumann est L'architecture Harvard est une


une conception théorique basée architecture d’ordinateur
sur le concept d'ordinateur à moderne basée sur le modèle info
programme stocké informatique basé sur le relais
Harvard Mark I.

Système mémoire Un seul bus est utilisé pour Dispose d'un espace mémoire
les extractions d'instructions séparé pour les instructions et les
et les transferts de données. données qui sépare physiquement
les signaux, le code de stockage et
la mémoire de données.
Traitement des instructions L'unité de traitement L'unité de traitement peut
a besoin de deux exécuter une instruction en
cycles d'horloge pour un cycle si des plans
terminer une instruction. de pipeline appropriés
ont été définis.

Utilisation L'architecture Von Neumann L'architecture Harvard est un


est généralement utilisée nouveau concept utilisé
littéralement dans toutes spécifiquement dans les
les machines, des ordinateurs microcontrôleurs et le traitement
de bureau, des ordinateurs numérique du signal (DSP)
portables, des ordinateurs
hautes performances aux
stations de travail.

Coût Les instructions et les données Type d'architecture


utilisent le même système de complexe car il utilise
bus, par conséquent la conception deux bus pour l'instruction
et le développement de l'unité et les données, un
de contrôle sont simplifiés, d'où facteur qui rend le
le coût de production devient développement de l'unité
minimum. de contrôle
comparativement plus
coûteux.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         8 
 
Chapitre II Principaux composants d’un ordinateur de type Von Neumann
II – 1 Schéma global d’une architecture basique d’un ordinateur
L’architecture d’un ordinateur basique est composée de trois parties :
‐ Processeur (unité centrale),
‐ Mémoire (s) (stockage)
‐ Les interfaces périphériques (liens avec l’extérieur).
II – 1 – 1 Schéma externe d’un processeur basique
Vu de l’extérieur, le processeur basique se présente sous la forme suivante :

Alimentation
Bus d’adresse

Horloge
(Quartz) Bus de données

Bus de contrôle

FIG. II-1 Vue externe d’un processeur basique

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         9 
 
II – 1 – 2 Schéma interne d’un processeur basique
Bus d’adresses

Bus de données

Bus de contrôle

Bus interne

Registre
d’instruction Pool de 
registres 
 
 
Unité 
Arithmétique et   
  Signaux Logique 
Pointeur de 
pile 
Unité de    De
commande  Compteur 
Contrôle Registre codes 
programme 
conditions 

FIG. II-2 Schéma interne d’un processeur basique

Les différentes parties internes de ce processeur basique sont :


‐ L’unité (ou organe) de commandes dont le rôle est de générer des signaux internes de
contrôle (microcommandes) à destination des différentes parties internes du processeur
suivant un timing bien précis (séquenceur cadencé par une horloge). Cette unité peut être
soit câblée soit micro programmée (ROM contenant des microcommandes).
‐ L’Unité Arithmétique et Logique (UAL ou ALU en anglais). Son rôle consiste à faire
des opérations arithmétiques et logiques et alimente les flags (ou drapeaux) du registre
codes conditions suivant les aspects du résultat de l’opération.
‐ Le registre codes conditions est composé de flags :
 C = Carry (retenue),
 S = Signe du résultat de l’opération,
 P = Parité de l’octet,

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         10 
 
 O = Débordement (Overflow)
 A = retenue auxiliaire,
Etc.

‐ Pool de registres
 Un ensemble de registres dont le pointeur de pile et le compteur
programme (celui-ci est considéré comme un registre bien qu’il soit un
compteur).
‐ Registre instruction (celui-ci reçoit l’instruction machine à exécuter).
‐ Le bus interne véhiculant les données ou instruction.
Remarque :
A l’extérieur du tracé en pointillé, on distingue trois bus (bus d’adresses
monodirectionnel, bus de données bidirectionnel et le bus de contrôle constitués de signaux dirigés
dans un sens ou dans l’autre). Ces trois bus constituent le bus système.
II – 2 Mémoires
On distingue différents niveaux de mémoire :

Mémoire statique
(SRAM)
Mémoire volatile
(Mémoire vive) Mémoire dynamique
Mémoire primaire (DRAM)

ROM, PROM
Mémoire non volatile EPROM, EEPROM
(Mémoire permanente) NVSRAM ….

Mémoire secondaire : Disques, Tambours, Bandes, …


(Grand stockage, archivage, .. )

Glossaire :

RAM : Random Access Memory.


SRAM : Static RAM.
DRAM : Dynamic RAM
ROM : Read Only Memory
PROM : Programmable ROM
EPROM : Erasable PROM
EEPROM : Electrically Erasable PROM

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         11 
 
NVSRAM : Non Volatile SRAM

ROM : le constructeur inscrit l’information en usine sur spécification du client, non modifiable et
exploitée seulement en lecture.

PROM : l’utilisateur inscrit électriquement les informations une fois pour toute avec un appareil
appelé programmateur et que l’on exploite ensuite en lecture seule.

EPROM : inscriptible électriquement comme les PROMs, exploitée en lecture, que l’utilisateur efface
le contenu en exposant le boitier mémoire aux rayons Ultraviolet (UV).

EEPROM : inscriptible électriquement comme la EPROM mais que l’utilisateur efface et


reprogramme électriquement.

Ces quatre types de mémoire se caractérisent par une dissymétrie entre les opérations de lecture et
d’écriture. La lecture est rapide et facile tandis que l’écriture est lente, complexe et utilise parfois des
procédés différents (inscription avec des tensions élevées, rayons UV pour effacer, …).
La mémoire primaire (mémoire principale dans certains cas) se caractérise par
‐ La capacité : donne le nombre de bits que l’on peut stocker.
‐ Le format (ou organisation) : le format précise la répartition de ces bits en nombre de mots
et taille des mots. Par exemple une capacité de 16384 mots de 1 bit ou bien 2048 mots de
huit bits.
‐ L’adresse : l’accès à un mot particulier se fait par une adresse repérant chacun des mots.
Pour toutes mémoires à semi-conducteurs, sauf les FIFO, l’adressage est aléatoire, ce qui
signifie que les valeurs successives des adresses se suivent de manière quelconque.
‐ Le temps d’accès : indique le temps au bout duquel l’information devient disponible après
une demande de lecture.
‐ Le temps de cycle : est l’intervalle séparant deux opérations successives (lecture, écriture).
Le temps de cycle de la plupart des mémoires actuelles est égal au temps d’accès.

Le fonctionnement des mémoires se décrit par des diagrammes des temps propres à chaque opération
appelés :
‐ Cycle de lecture,
‐ Cycle d’écriture,
‐ Cycle d’effacement,
‐ Etc …

Des paramètres temporels caractérisant chacun d’eux en donnent les relations de phase à respecter
entre les signaux. Aux paramètres habituels comme les temps d’établissement ou de maintien
s’ajoutent de nombreux autres : il y a une vingtaine de paramètres pour une mémoire statique et une
quarantaine pour une DRAM.
Généralement, un boitier mémoire ne suffit pas pour une application. On constitue une matrice (plan,
banc, module, barète) pour obtenir le nombre de mots ou la taille des mots désirés. On parle
d’organisation mémoire.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         12 
 
Exemple d’organisation mémoire :

Soit le boitier mémoire suivant de capacité de 1GO :

Sélection boitier (Chip Select)  C/S 


Fil de Lecture / écriture
R/W 

1 GO 

Bus d’adresse Adresse 

(30 bits)           Donnée  Alimentation


(VCC, Gnd)
Bus de données (sur 8 bits)
FIG. II-3 Boitier mémoire de 1GO
A partir du précédent boitier, on réalise un plan mémoire de 1G x 16 bits. Voici sa réalisation :

Sélection boitier  C/S   C/S 


Lec./Ecr.
R/W  R/W 

1 GO  1 GO 
Bus
Adresse  Adresse 
d’adresses         Donnée 
        Donnée 
(30 bits)

Bus de données (2 octets = 16 bits)

FIG. II-4 Plan mémoire de 1G mots de 16 bits


Relier les deux C/S ensemble par un seul fil, signifie la sélection parallèle des deux boitiers en même
temps.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         13 
 
Plan mémoire de 16 GO avec des boitiers mémoire de 2 GO

Trois fils d’adresses de poids forts

Décodeur 3 vers 8 

Y0          Y7 

CS  CS 

R/W  R/W 

2GO  2GO 

Adresses  Adresses 

Données  Données 
Bus @ (31 bits)

Bus de données sur 1 octet (8 bits)


FIG. II-5 Plan mémoire de 16 GO avec des boitiers mémoire de 2 GO
Ce plan mémoire convient sur le plan logique, mais il présente un problème sur le plan temporel.
Conflit de bus
Les schémas des plans mémoires précédents conviennent sur le plan logique mais pas sur
le plan temporel car il y a conflit de bus (il s’agit d’une mise en court-circuit temporaire des sorties).
Lorsque les poids forts commutent, les validations de deux modules (plan ou pages) sont jointives et
si une mémoire a un temps de désélection plutôt long tandis qu’une autre a un temps de sélection
plutôt rapide, les sorties se trouvent simultanément en basse impédance. Ceci provoque des courts
circuits importants. Pour éviter ce problème, il faut que les modules soient désélectionnés quand varie
l’adresse et que les deux sélections successives soient suffisamment espacées dans le temps pour que
la désélection soit terminée avant que ne commence la sélection. Une solution consiste à valider le
décodeur d’adresses des poids forts par un signal VAL (ou VMA = Valide Memory Address) qui
exclut ainsi toute zone de recouvrement de sélection.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         14 
 
II – 3 mémoire cache
A- La conception d'un cache
Concepts de base
Un cache est une petite mémoire, 10 à 25 fois plus rapide qu'une mémoire conventionnelle. Il
conserve une copie des informations récemment et couramment utilisées par les programmes. Les
informations présentes dans le cache sont accédées plus rapidement que si elles étaient en mémoire.
Le cache est composé de deux parties : d’un répertoire1 et d'une mémoire à accès aléatoire (RAM).
La partie mémoire est divisée en un nombre de lignes de tailles identiques pouvant stocker chacune
un bloc mémoire de plusieurs mots. Le répertoire, qui généralement est organisé en associativité
totale, est constitué de blocs composés d'une partie index2, qui contient une partie de l'adresse
mémoire d'une ligne présente dans le cache, et d'un certain nombre de bits de contrôle indiquant l'état
de la ligne et assurant la cohérence des données du cache avec celles en mémoire. Le répertoire
contient une entrée pour chaque ligne du cache. Le cache peut avoir un adressage virtuel ou physique.
Quand une donnée référencée n'est pas présente au niveau du cache, un défaut de cache se produit.
Celui-ci peut être résolu de deux manières : Le bloc peut être ramené dans le cache puis vers le
processeur. Cette technique est appelé load through. Autrement, le bloc peut être directement
transféré vers le processeur en court-circuitant le cache, ce dernier est mis à jour ultérieurement, cette
technique est appelée fetch by pass.
Les performances d'un cache peuvent être caractérisées par deux (02) aspects :
 Le temps d'accès auquel il ne peut échapper car étant une mémoire. Il est difficile d'évaluer de
façon exacte ce paramètre sans avoir à décrire le circuit et sa technologie.
 Les défauts de cache qui sont les références mémoires accédant à des données non présentes dans
le cache. L'évolution des performances d'un cache fut longtemps axée sur l'évaluation des défauts
de cache, le temps d'accès quoique influencé par la taille du cache fut négligé. Peu d'études et de
simulations lui ont été consacrées. HOROWITZ & HENNESY comblèrent ce déficit et
présentèrent dans leur étude une série de simulations explorant l'interaction entre différentes
organisations et le temps d'exécution d'un programme.
L'implantation d'un cache répond à un souci d'efficacité et de rapidité dans l'exécution des
programmes. Ainsi, on tend à optimiser (minimiser) certains paramètres tels que :
 La probabilité de ne pas trouver une référence dans le cache (miss ratio).
 Le temps d'accès aux données du cache (Access time).
 Le temps dû au traitement d'un défaut de cache.
 Le temps et le nombre de mises à jour de la hiérarchie mémoire.
 La pollution du cache.

Il est impossible d'optimiser l'ensemble de ces paramètres. Il est évident que certains compromis
doivent être acceptés. La conception d'un cache reste conditionnée par plusieurs contraintes et
compromis ; les paramètres importants dans la conception d'un cache restent : l'algorithme de
placement qui détermine la correspondance entre les adresses mémoire et les locations cache,
l'algorithme d'anticipation, l'algorithme de remplacement, l'algorithme de mise à jour de la
                                                            
1
Directory
2
TAG

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         15 
 
mémoire et enfin la taille du cache et des lignes. Pour une meilleure gestion, le cache peut être
partitionné en plusieurs caches indépendants sous forme de bancs, les données peuvent être, grâce
à cela, entrelacées à travers les différents bancs pour permettre un temps d'accès plus court. Le
problème sera dans ce cas de trouver la méthode d'entrelacement la plus efficace et la taille des
bancs optimale. Pour pouvoir répondre à plusieurs requêtes simultanément, répondre à une requête
et faire une anticipation en même temps ou bien faire une anticipation et résoudre un défaut de
cache, le cache peut être multiport. Plus encore, le cache peut être pipeliné, plusieurs requêtes
peuvent être faites en cascade et progressivement. Certes, toutes ces approches restent très
prometteuses mais leur mise au point reste délicate.
La localité spatiale, la localité temporelle
L'enchaînement des références faites par un programme lors de son exécution dépend de la manière
dont celui-ci est conçu et compilé. Il a été observé que les programmes ont tendance à répéter
souvent les mêmes opérations. Ainsi, il est unanimement admis qu’un programme passe 90% de son
temps à exécuter 10% de son code.
La théorie du cache est basée sur le principe de la localité. La première notion, celle de localité
spatiale signifie que la référence mémoire la plus probable au temps t+1 est la référence la plus
proche en termes de contiguïté physique de celle au temps t.
Exemple : les tableaux et l'exécution séquentielle des instructions.
La deuxième, celle de localité temporelle stipule qu'une référence qui est en cours d'utilisation a
une forte probabilité d'être réutilisée à nouveau.
Exemple : les boucles.
Ainsi, afin de déterminer automatiquement quelles sont les données à conserver, le cache utilise
les propriétés de localité des applications. Si une zone mémoire est référencée, il est probable
qu’elle-même ou une zone mémoire proche sera référencée dans un futur très proche.
La volonté d’exploiter la localité des références affecte de façon non négligeable la conception d’une
hiérarchie mémoire. L’exploitation de la localité temporelle justifie l’utilisation de l’algorithme de
remplacement LRU (Least Recently Used) qui consiste à évacuer le bloc le moins récemment
référencé. De même, la localité spatiale est susceptible d’influencer la granularité utilisée dans le
système de hiérarchie mémoire.
Il existe plusieurs manières de profiter de la localité des programmes, les méthodes logicielles sont
les plus utilisées. Elles consistent soit à améliorer la localité des références mémoires en transformant
le code de l’application pour changer l’ordre des références, cela peut se faire au niveau de la
compilation, ou bien modifier le placement des données en mémoire, ce qui change directement
l’ordre des accès mémoire et donc la localité des programmes.
La gestion logicielle de la localité est un facteur déterminant dans la réduction des défauts de cache.
Les résultats obtenus par TRUONG d'une part et GLOY&SMITH d'autre part montrent qu'en plaçant
correctement les données en mémoire, il est possible de réduire les taux d'échecs de façon importante
dans un grand nombre de cas, aussi bien pour les caches à correspondance directe (réduction du taux
d'échec entre 25% et 76%) que pour les caches associatifs (jusqu'à 64%). Ceci en réduisant les conflits
de placement dans le cache et en même temps la localité spatiale.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         16 
 
La recherche
Une donnée peut être ramenée vers le cache de plusieurs manières. L'algorithme de recherche doit
décider quand et comment une donnée doit être ramenée vers le cache. Il existe trois (03) méthodes
pour ramener une donnée vers le cache : la recherche à la demande, l'anticipation et la recherche
sélective.
La recherche à la demande consiste à ramener un bloc vers le cache quand celui-ci est référencé. Cette
stratégie est simple à implémenter mais n'améliore en rien l'efficacité d'un cache. Certes, les
performances d'un cache dépendent d'autres paramètres telle la taille du cache, mais la recherche à la
demande est le résultat d'un défaut de cache et c'est précisément ce paramètre que l'on doit réduire.
L'anticipation implique ramener une donnée avant qu'elle ne soit référencée. Ce type de recherche
peut s'avérer très efficace. Ainsi, l'anticipation séquentielle qui consiste à ramener le bloc i+1 si le
bloc i est référencé peut réduire jusqu'à 50% le nombre de défauts de cache sous certaines conditions
de taille du cache.
La recherche sélective permet un choix sur les données à ramener vers le cache. L'algorithme de
recherche peut décider de ne pas ramener une donnée vers le cache et de la charger directement de la
mémoire ou du disque en court-circuitant le cache. Un exemple est donné dans le cas des systèmes à
multiprocesseur où les données communes peuvent ne pas être mises en cache pour assurer une
meilleure cohérence de celles-ci.
Politique de placement
Le rôle essentiel de l’algorithme de placement est de savoir où mettre les données dans le cache. Il
détermine le lien entre les adresses en mémoire et les locations du cache. L’algorithme de placement
dépend essentiellement de l’organisation du cache et de son architecture. Ainsi, pour les organisations
associatives chaque ligne mémoire peut être placée dans n'importe quelle ligne cache. Les
organisations directes et associatives par ensembles utilisent d'autres fonctions de placement, parmi
les plus simples la fonction modulo.
L'intérêt du placement des données apparaît essentiellement dans un cache multi-bancs. L'utilisation
de plusieurs bancs, si elle est bien gérée, peut générer des gains de performance importants. Cela
permet également d'étendre les organisations du cache classiques en des organisations plus complexes
telles l'organisation associative brouillée et l'organisation à secteurs entrelacés.
Pour profiter de la configuration en multi-bancs, la fonction de placement doit prendre en
considération les paramètres suivants :
1. Egalité : Le nombre de lignes mémoire qu'on peut placer dans chaque ligne du cache est
toujours le même.
2. Dispersion à travers les bancs : Dans un cache associatif par ensemble, quand deux lignes
de données sont placées dans la même ligne cache, un conflit de placement se produit au
niveau de chaque banc i du cache. Pour éviter cela, la fonction de placement doit être choisie
telle que, si deux lignes sont en conflit sur une location de banc i, il est peu probable qu’elles
soient sur une location du banc j. L'organisation associative brouillée est un exemple
efficace de cette stratégie.
3. Dispersion à travers un même banc : Beaucoup d'applications possèdent une forte localité
spatiale. Les fonctions de placement doivent être choisies de façon à éviter que deux lignes
mémoire contiguës ne se disputent la même ligne cache. La fonction de placement doit

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         17 
 
limiter le nombre de conflits lors du placement de n'importe quelle région consécutive de la
mémoire dans une ligne i du cache.
4. Implémentation matérielle simple : Les fonctions de placement doivent pouvoir être
implémentées très simplement de façon à éviter les pertes de temps dans les accès aux blocs.
Organisations du cache
Le cache peut être organisé différemment pour sauvegarder des données. L'organisation du cache
permet de définir le placement des données sur celui-ci et ainsi faire la correspondance entre l'adresse
mémoire et les adresses du cache. La référence faite par un programme vers une donnée est utilisée
par l'organisation du cache qui doit pouvoir retrouver la donnée référencée ou indiquer un défaut de
cache si la donnée n'est pas présente au niveau du cache.
Les Blocs cache sont notés Bi pour i = 0,.., m. Les blocs mémoire sont notés Bj pour j = 0,.., n.
On considère n>>m, n= 2s avec s : nombre de bits nécessaires pour adresser les blocs mémoires, m=2r
avec r : nombre de bits nécessaires pour adresser les blocs cache. Chaque bloc cache contient b mots
où b= 2w avec w : nombre de bits nécessaires pour adresser un mot dans un bloc. La taille du cache
est définie par m x b = 2r+w mots et la mémoire contient n x b = 2s+w mots. Les blocs cache peuvent
être regroupés en v = 2t ensembles de 2,4… ou k blocs avec
k = m/v = 2r-t.
Organisation directe
Cette organisation associe à chaque bloc cache n/m = 2 s-r blocs mémoires séparés entre eux par la
même distance. La fonction de placement est définie en utilisant la fonction modulo m.
Un bloc Bj est placé dans un bloc Bi tel que :
Bj Bi Si i = j (modulo m)
Chaque bloc Bj ne peut être mis que dans un et un seul bloc Bi. La politique de remplacement dans ce
cas n’est pas nécessaire. L'adresse d'un bloc à charger détermine le bloc cache qu'il doit occuper.
L'utilisation de cette organisation donne un cache très rapide.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         18 
 
 
  adresse s+w
Tag Cache Mémoire
  Tag Bloc Word Data W0
Data B0 W1
B0
  Data W2
Data W3
  s-r r w  
s-r
   
 
  s
Data W4J
  Data W(4j+1)
Compare w Bi Bj
Data W(4j+2)
  Data w W(4j+3)
(Hit in
 
   (Bloc  (Blocs)
cache)
  (Miss in

  FIG. II-6 : modèle d’adressage mémoire cache


 
 
 
Cache
  (block cache) B0
Tag B1
  2bits B0 B2
B3
 
B4
  B5
B1
B6
 
B7 Mémoire principale
  B8
B2 B9
  B10
  B11
B3 B12
  B13
B14
 
B15
 
FIG. II-7 : exemple d’une organisation directe m = 4 , n=16 
 

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         19 
 
L’adresse mémoire est composée de 3 champs :
Les w premiers bits indiquent le déplacement du mot dans le bloc. Les s bits suivants indiquent
l’adresse du bloc en mémoire, les (s-r) bits indiquent l’index (Tag). Quant aux r bits constituant le
champ bloc, ils sont utilisés dans la fonction modulo m où m =2r.
Chaque bloc cache contient un index qui sera comparé à celui de l’adresse. Un succès se produit s’il
y a égalité entre un index du cache et celui de l’adresse. Sinon, un défaut de cache se produit.
Dans le cas d’un succès (hit), les r bits sont utilisés pour identifier le bloc dans le cache. Si un défaut
se produit les s+w bits sont utilisés pour accéder à la mémoire.
Organisation Associative
Contrairement à l’organisation directe, cette organisation offre plus de flexibilité dans le placement
des blocs. Chaque bloc mémoire peut être mis dans n’importe quel bloc cache. Par conséquent, cette
organisation nécessite s bits d’index pour chaque bloc cache. Ceci peut représenter un espace
important dans le cache si s augmente. Autrement dit, l'espace occupé par les indexes peut s'avérer
important si on utilise des blocs de petite taille.
Dans l’organisation associative, l’index présent dans l’adresse est comparé avec tous les autres
indexes dans le cache. Ce schéma offre une grande flexibilité mais peut consommer énormément de
temps si les indexes étaient comparés séquentiellement. Pour gagner un temps précieux, des mémoires
associatives sont utilisées afin de comparer les indexes simultanément. Ce type de cache est rarement
utilisé en pratique, sauf parfois pour les petites structures comme les TLBs (Translate Lookside
Buffer : TLB stocke les traductions récentes des adresses mémoires virtuelles en adresses mémoires
physiques et peut être appelé un cache de conversion d'adresses), car il est impossible à l’implémenter
à un coût raisonnable.
L’avantage de l’organisation associative est de pouvoir utiliser un algorithme de remplacement plus
efficace en évitant les problèmes de placement, car chaque bloc mémoire peut être mis dans n'importe
quel bloc cache.
 

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         20 
 
 

 
Adresse mémoire s+w
  Tag Cache Mémoire principale
Tag Word Data W0
 
Data W1
B0 B0
   Data W2
s  Data W3
s
  w   
w 
  Data 
s
Data 
  s
Bi W4J
Data
   W(4j+1)
(Hit in cache) Data
Compare  Bj
 W(4j+2)
    w W(4j+3)
Data
  
Data  (Blocks)
Bm
  Data
s
Data
  (Miss in cache)

 
  FIG. II-8 : Organisation associative

  B0
Cache (blocks
cache) B1
  Tag
4 bits B0 B2

  B3

B4
 
B5
B1  
  B6
 
   B7 Mémoire principale
 B8
 
  B2  B9
B10
 
 B11
   B12
B3
B13
 
B14
  B15

 
FIG.
  II-9 : Exemple de placement : chaque bloc mémoire peut être mis dans
n'importe quel des 4 blocs cache
 

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         21 
 
 

Organisation Associative par ensemble


Cette organisation représente un compromis entre l'organisation directe et l'organisation associative.
C'est l'organisation la plus utilisée dans la conception des systèmes de mémoires.
Dans un cache associatif à K voies, les m blocs cache peuvent être regroupés en v=m/k ensembles3
de k blocs chacun. Chaque ensemble est identifié par d bits indiquant le numéro de l'ensemble où 2d
= v. Dans cette configuration, un bloc mémoire i quelconque peut être mis dans n'importe quel bloc
cache appartenant à l'ensemble (i modulo v). Pour résumer, cette organisation est directe dans le choix
de l'ensemble et associative à l'intérieur du même ensemble.
Si K=1 l'organisation est directe et si v=1, elle devient complètement associative.
 
Adresse mémoire s+w
Cache Mémoire principale
  Tag
Tag Set Word B0 B0
 
B1 B1
Set 0
   B2

B3
  s-d d w B(k-1)


   
w 

  B(ik)
B(ik+1)
B(ik+1)
   Set i 
 
  B(ik+k-1)
(Hit in cache) 
Compare 
 

  (Miss in cache)

  FIG. II-10 : Organisation associative par ensembles


 

L'adresse mémoire contient un champ "set" utilisé pour adresser l'ensemble où pourrait se trouver le
bloc référencé. Le champ index est ensuite comparé aux index de tous les blocs du même ensemble.
Si une correspondance est trouvée le champ mot est alors utilisé pour accéder au mot référencé.
Cette organisation apporte de meilleures performances dans la mesure où le nombre d'indexes à
comparer est réduit. Notons enfin que le nombre de lignes par ensemble est appelé degré
d'associativité.
 

   

                                                            
3
Set en anglais

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         22 
 
 

 
Tag (2 bits) cache
 
B0 B0
  Set 0 B1
B1
  B2
B3
  B4
B2 B5
  Set 1
B3 B6
 
B7 Mémoire principale
 
B8
  B4 B9
Set 2
  B5 B10
B11
  B12
  B13
B6
Set 3 B14
  B7 B15
 
FIG. II-11 : Exemple d'organisation associative par ensemble à 2
  voies
Organisation par secteur
Dans cette organisation, la mémoire et le cache sont partitionnés en un certain nombre de secteurs,
chacun composé d'un certain nombre fixe et ordonné de blocs. Chaque secteur mémoire peut être
placé dans n'importe quel secteur cache, à condition de respecter l'ordre des blocs dans un secteur.
La requête est faite pour un bloc. Si un défaut se produit, deux scénarii peuvent être envisagés : soit
tout le secteur auquel le bloc appartient est entièrement ramené de la mémoire ou bien le bloc ayant
causé le défaut de cache est le seul à ramener. Dans le deuxième cas, le ième bloc du secteur mémoire
est placé dans le ième bloc du secteur cache. Les autres blocs du secteur cache sont invalidés.
Cette organisation offre plus de flexibilité pour implémenter différentes politiques de remplacement
et permet de réduire le nombre d'indexes à comparer, ainsi que l'espace qu'ils peuvent occuper.
La taille des secteurs n'étant pas définie à priori, ceci permet de profiter au mieux de la localité des
programmes, en détectant la bonne taille de secteur et réduire le trafic cache/mémoire.
 

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         23 
 
 

  Adresse mémoire
(3bits) (2bits) (4bits)
 
Sector Block Word Mémoire principale secteurs

  B0
Secteur cache
Valid bit B1 0
  (3 bits)
B2
Tag B0
  B3
B1 B4
  0
  B5
B2 1
  B6
B3 
B7
  Tag  
B4  
2
  B5  
1
 
  B6    
3

  B7  
Tag
  B8
   
4
B9  
  2  
B10 
     
B11 5
  Tag  
B12
       
B13 6
3
  B14
  
B28
  B15
B29
  B30 7
B31
 

  FIG. II-12 : Organisation par secteur à 4 voies


 

Politique de remplacement
L'état le plus important d'un cache, où l'étude de celui-ci devient intéressante est lorsqu'il est plein.
Cet état intervient après un état de démarrage appelé "démarrage à froid" durant lequel le cache se
remplit au fur et à mesure des références. A l'état d'équilibre (steady state ou cache plein), chaque
défaut de cache ou anticipation implique un remplacement. Une ligne doit être enlevée du cache pour
être remplacée par une autre. L'algorithme de remplacement a pour rôle de déterminer la ligne à
remplacer. Le chargement d'une ligne dans le cache se fait au détriment d'une ligne déjà présente si
cette dernière a été modifiée, elle est mise à jour au niveau de la mémoire. Dans le cas contraire elle
est tout simplement écrasée.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         24 
 
La politique de remplacement est très influencée par la localité spatiale ou temporelle des références.
Les lignes contenues dans le cache n'ont pas la même importance, certaines seront référencées à
nouveau pendant qu'elles sont dans le cache et d'autres non. A chaque moment, le cache contient deux
types de lignes, des lignes vivantes et des lignes mortes. Les lignes vivantes sont importantes pour le
cache car leur référence crée un succès. Quant aux lignes mortes, elles ne seront plus accédées durant
leur présence dans le cache, elles sont inutiles et créent une pollution du cache.
Les algorithmes de remplacement sont classés en deux groupes distincts :
- Les algorithmes basés sur l'usage prennent en compte l'utilisation des lignes dans le
remplacement, exemple LRU4.
-
Les algorithmes non basés sur l'usage prennent pour le remplacement d'autres paramètres
pour l'utilisation des lignes, exemple FIFO et RANDOM.
Il est à noter que l'organisation directe n'a pas besoin d'une méthode de remplacement spécifique, une
ligne mémoire ne peut être mise que dans une seule ligne du cache, donc il n'existe qu'une seule
possibilité de remplacement.
Politique de remplacement aléatoire
C'est l'algorithme de remplacement le plus simple à implémenter. Le choix de la ligne à remplacer se
fait d'une façon complètement aléatoire sans faire attention aux références. Son implémentation peut
être obtenue par un compteur cyclique qui sera incrémenté à chaque référence et qui donnera à chaque
fois que c'est nécessaire la ligne à remplacer.
Politique LRU (Least Recently Used)
L'algorithme de remplacement LRU est le plus utilisé dans la gestion mémoire. Il consiste à remplacer
la ligne dont la dernière référence est la plus ancienne parmi toutes les lignes du cache. Il est
implémenté en utilisant des compteurs d’âge associés à chaque ligne du cache. Le compteur est
incrémenté à intervalles réguliers et remis à zéro dès que la ligne est référencée. A tout moment, la
valeur de chaque compteur indique l'âge de la ligne depuis sa dernière référence. La ligne LRU est
celle ayant la valeur de compteur la plus élevée.
Politique de remplacement optimal
Elle consiste à remplacer la ligne dont la prochaine référence est la plus lointaine dans le futur.
Cependant, il est délicat d'implémenter cette politique car il faut connaître l'enchaînement futur des
références pour faire ce choix.
Politiques de mise à jour du cache
Le cache est une mémoire temporaire, quand une donnée est modifiée au niveau du cache, cette
modification doit être répercutée sur les niveaux supérieurs de la hiérarchie mémoire. Ainsi, une
cohérence de données doit être maintenue au niveau de la hiérarchie mémoire. Plusieurs politiques
de mise à jour peuvent être envisagées :
 Ecriture simultanée (write-through) : Lorsqu’une ligne est modifiée dans le cache, cette
modification est immédiatement répercutée dans les niveaux supérieurs de la hiérarchie
mémoire. Cette politique garantit à tout moment la cohérence entre les différents niveaux
mais augmente le trafic sur le bus de données.

                                                            
4
LRU : Least recently used.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         25 
 
 Recopie (write back) : La ligne est marquée modifiée, elle ne sera recopiée dans les niveaux
supérieurs de la hiérarchie que si elle est la cible d'un remplacement au niveau du cache.
Si à présent, on décide d'écrire une donnée dans une ligne absente du cache, l'une des deux options
suivantes est utilisée :
 Ecriture attribué (write-allocate) : La ligne est chargée dans le cache puis modifiée.
 Ecriture non attribuée (no write-allocate) : la ligne est modifiée directement dans le
niveau supérieur de la hiérarchie et non chargée dans le cache.
Généralement, l'option write-allocate est associée à la politique d'écriture write back, et l'option no
write allocate à la politique d'écriture write through.

II – 3 Hiérarchie mémoire
Hiérarchie mémoire
- Etude des diverses organisations mémoires hiérarchisées,
- Mécanismes de translation d'adresse pour atteindre l'espace physique réel.

But
Harmoniser la vitesse de fonctionnement de l'unité centrale et le débit d'informations de la
mémoire (bande passante).

II – 3 - 1 Structure d'une hiérarchie de mémoire


Objectif
Augmenter la vitesse du processeur en augmentant le débit de transfert d'informations à un
coût raisonnable.
Les objectifs d'une hiérarchie de mémoire dans un système de traitement multiprocesseur parallèle et
dans un système monoprocesseur multiprogrammé sont les mêmes.
- Une différence existe dans ces deux hiérarchies de mémoire. Elle est due aux caractéristiques
différentes des références mémoires.
- Dans le cas d'un système multiprocesseur parallèle, il peut y avoir :
- des requêtes concurrentes au même niveau de hiérarchie de mémoire.
 Conflit d'accès  dégradation de la performance du système.
Solution
- Partitionner la mémoire d'un niveau donné en plusieurs modules afin que certains
degrés de concurrence d'accès puissent être résolus.

Les mémoires dans une hiérarchie peuvent être classées sur la base de plusieurs
caractéristiques :
- méthode d'accès :

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         26 
 
- RAM (mémoire à accès aléatoire),
- SAM (mémoire à accès séquentiel),
- DASDs (Direct Acces Storage Devices) = dispositif de stockage à accès
direct.

- vitesse ou temps d'accès :


- le premier niveau de hiérarchie de mémoire est le plus rapide,
- le dernier niveau a le temps d'accès le plus lent.
Sur la base du temps d'accès, la mémoire peut être classée en :
- mémoire primaire (RAMs),
- mémoire secondaire (DASDs, SAMs)

La figure suivante résume cette organisation :

Registres 
# 0  Unité centrale 

 
Mémoire cache 
# 1   

M.C ultra rapide 
R  
A # 2  Mémoire 

Bulk memory

Disque à tête 
fixe 

S  Disque à tête 
mobile

S  Bande 
A  magnétique 


FIG. II-13 : Organisation mémoire

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         27 
 
D.A.S = Direct Acces Storage
S.A.S = Sequential Acces Storage.

- En général, la hiérarchie mémoire est structurée de sorte que les mémoires à un niveau i sont
plus rapides que celles du niveau i+1.

- Une hiérarchie mémoire est habituellement organisée de manière que l'espace d'adressage du
niveau i est un sous ensemble du niveau i+1.

- Une adresse mémoire Ak dans le niveau i n'est pas nécessairement l'adresse Ak dans le niveau
i+1.
- N'importe quelle information dans le niveau i, existe aussi dans le niveau i+1.
- Mais certaines informations dans le niveau i peuvent être plus récentes que celles qui sont dans
le niveau i+1 (problème de la cohérence des données).
II – 3 - 2 Optimisation d'une hiérarchie de mémoire
But
Concevoir une hiérarchie mémoire à n niveaux pour atteindre une performance
équivalente en temps d'accès à celle de la mémoire la plus rapide et le coût par bit
équivalent à celui de la mémoire la moins chère.
Hiérarchie de mémoire dépend d'une variété de facteurs corrélés :
- manière dont un programme référence la mémoire,
- le temps d'accès,
- la taille ou le volume de chaque niveau,
- la taille ou le volume d'informations transférées,
- stratégie de gestion,
- conception du réseau d'interconnexion processeurs-mémoire.

II – 4 Les interfaces périphériques (liens avec l’extérieur).


Les Entrées / Sorties assurent l’échange de données entre la machine et l’extérieur par
le biais des interfaces périphériques.
Cette partie présente les techniques d’entrées-sorties et les illustre par des exemples. Les
principes de base seront présentés : entrée-sorties parallèles et entrées sorties sérielles. Puis sont
présentées les techniques nécessaires pour séquencer les opérations des unités d’entrée-sortie :
entrées-sorties programmées, interruptions et accès direct-mémoire.
Clarifions d’abord un problème de terminologie. Les gros ordinateurs étaient munis
traditionnellement d’instructions mémoire et d’instructions d’entrée sortie. Cette distinction est
périmée, en ce qui concerne les microprocesseurs et microcontrôleurs.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         28 
 
Entrées-Sorties spéciales vs Entrées-Sorties projetées en mémoire
La conception traditionnelle des ordinateurs distingue les instructions dites d’entrées-sorties
et les instructions mémoire.

Entrées-sorties projetées en mémoire


Les E/S projetées en mémoire consistent à utiliser des instructions mémoire pour accéder aux
unités d’entrée-sortie. Cela autorise le processeur à utiliser les mêmes instructions pour les transferts
d’E/S que celles qu’il utilise pour les transferts en mémoire. Un port d’E/S est alors traité comme un
emplacement (une adresse) mémoire. L’avantage est que la même puissance des instructions utilisées
pour lire et écrire en mémoire peut être mise à profit pour faire entrer et faire sortir des données. A
titre d’exemple, en entrées-sorties projetées en mémoire, il est possible d’effectuer des opérations
arithmétiques directement sur une bascule d’entrée-sortie sans avoir à transférer les données dans des
registres temporaires.
Quels sont les inconvénients ?
D’abord chaque port d’E/S utilisé de cette manière occupe un emplacement dans l’espace
mémoire. Si donc on a besoin de toutes les positions comme mémoire proprement dite, on ne doit pas
utiliser les entrées-sorties projetées en mémoire car une partie de ces adresses est "gaspillée" par les
entrées-sorties du système à microprocesseur. D’autre part, les instructions mémoire exigent
normalement trois octets pour adresser le port, tandis que les instructions d’E/S spécialisées peuvent
se contenter de 8 bits pour adresser un port, d’où encombrement supérieur. Troisièmement, les
instructions d’E/S projetées en mémoire peuvent être plus longues à exécuter que les instructions
spécialisées, à cause de l’octet d’adressage court, c’est-à-dire l’utilisation d’instructions mémoire sur
deux octets.

Entrées-sorties spécialisées
Dans le cas des instructions d’E/S spécialisées, le processeur envoie des signaux de contrôle
qui indiquent que le cycle en cours concerne les E/S et non la mémoire. Deux lignes spécialisées sont
fournies : lecture entrée-sortie et écriture entrée-sortie. Il faut peu de lignes d’adresse pour
sélectionner les ports d’E/S puisque virtuellement tous les Systèmes ont besoin de moins de ports que
d’emplacement mémoire.
Les E/S spécialisées ont trois avantages. Premièrement, comme on utilise des instructions
spéciales on peut facilement les distinguer des instructions mémoire pendant la programmation, ce
qui est commode. Deuxièmement, comme l’adressage est plus court, il faut moins de composants de
décodage. Troisièmement, les instructions sont plus courtes.
Il y a toutefois trois inconvénients : l’utilisateur perd la puissance potentielle de traitement
offerte par les E/S projetées, et, bien plus important, deux broches doivent être "gaspillées" pour
"lecture périphérique" et "écriture périphérique". Enfin un code supplémentaire doit être alloué à ce
type d’instruction. Pour cette raison, cette technique n’est presque jamais utilisée avec les
microprocesseurs.
La figure suivante (FIG. II-14) montre un système à E/S projetées en mémoire où le signal, qui
détermine si l’adresse concerne la mémoire où les périphériques, dépend de l’état de A15. Si A15 est
à l’état haut, toutes les adresses sur les bits A0 à A14 spécifient un périphérique. Si A15 est à l’état
bas, A14 à A0 sélectionnent une position mémoire.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         29 
 
MEMR Vers mémoire
MEMW

I/OR
Vers
E/S
I/OW

A15
FIG. II-14 : La figure ci-dessus présente les Entrées-Sorties projetées en mémoire

La figure FIG. II-15 montre un système à entrées-sorties spécialisées avec des lignes de contrôle
séparées pour la mémoire et les fonctions d’E/S. Le bus d’adresses sélectionnera un périphérique et
un registre, ou un emplacement, dans le périphérique. Ceci est illustré sur la figure FIG. II-15. Le bus
de contrôle spécifie quelle opération doit être effectuée.

p  MEMR
Vers mémoire
  MEMW

IOR  Vers
E/S
IOW 

FIG. II-15 : Entrées Sorties spécialisées

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         30 
 
Bus d’adresse

CS CS CS

µp

Sélection Sélection
case registre

Mémoire Boitier
E/S
FIG. II-16 : Sélection d’un port d’E/S

Entrées-sorties parallèles
Une interface parallèle requiert des bascules et des "drivers" de bus. Examinons d’abord un
port d’entrée-sortie LSI (Low Scale Integration : Intégration à petite échelle) élémentaire. D’après la
Figure FIG. II-17, il est muni d’un ampli d’entrée qui mémorise les signaux venant d’un périphérique
et les maintient stables jusqu’à ce que le microprocesseur demande cette information. Il contient
également un amplificateur de sortie qui mémorise les données en provenance du microprocesseur
pour les conserver aussi longtemps que le périphérique en a besoin. En outre, il faut un mécanisme
de sélection et une commande de lecture-écriture pour les registres ou ports. La figure FIG. II-17
illustre conceptuellement ce que requiert un tel port d’entrée-sortie simple.

Bus de Données

Sélection 
Tampon d’entrée  Tampon de sortie 

FIG. II-17 : Port d’entrée-sortie élémentaire.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         31 
 
Bus de Données

Bus @ 
Données 

    Adresse      Donnée 
Périphérique

Interface E/S
Commandes 

         Etat 

Bus de commande

FIG. II-18 : Port d’E/S simple

Boitier d’Entrées-Sorties parallèles programmable


Le composant d’Entrées-Sorties parallèles programmable (Programmable Input Output ou
PIO) exécute les fonctions suivantes : décodage d’adresse, mémorisation et multiplexage des données
en entrée et en sortie, "prise de contact", ainsi que d’autres fonctions de commande décrites plus tard.

Le décodeur d’adresse sélectionne l’un des registres internes en lecture ou en écriture. Ces
registres peuvent être le tampon d’entrée, le tampon de sortie, le registre-direction ou le registre d’état.
D’habitude, il faudra fournir en plus du bit de sélection de boitier, trois bits d’adresse pour
sélectionner 6 à 8 registres internes : de plus, le PIO est programmable. Que signifie ce terme ?
Le concept nouveau est l’utilisation du registre "direction des données" : il est possible de configurer
un port bit-par-bit pour spécifier par exemple que les trois premiers bits fonctionnent en entrée et les
cinq derniers en sortie. Ceci est valable pour toute autre combinaison. La direction de chaque ligne
des ports du PIO est programmable. Chaque bit du registre de direction spécifie si le bit correspondant
du PIO sera une entrée ou une sortie. Typiquement "0" veut dire entrée, "1" veut dire sortie. Le PIO
est programmable aussi sous d’autres aspects. Chaque PIO a un ou plusieurs registres de commandes
qui spécifient le fonctionnement de la logique de contrôle. Enfin, chaque PIO multiplexe sa liaison
au bus de données du microprocesseur en 2 ou 3 ports de 8 bits. Un PIO apparait à la figure FIG. II-
19.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         32 
 
Lignes de bus
Port 1 Port 2

Tampon données 1 Tampon données 1

Sélection reg
Registre Fonction Registre Fonction

Registre Etat

MUX Logique de
Commande

ACK
INT

Chip Select
DMA

Bus de données du µp

Signaux de contrôle

FIG. II-19 : Type PIO

Le PIO de la figure FIG. II-19 a deux ports associés chacun à son propre registre-direction : en outre,
un registre d’état indique la situation de chaque port et ses options de fonctionnement.

Entrées Sorties sérielles


Plusieurs périphériques exigent des communications sérielles. Au lieu de transmettre 8 bits en
parallèles, il faut faire passer les bits d’un octet sur un seul fil, un par un. Cette méthode de
transmission, connue sous le nom d’interface série, a donné naissance à plusieurs standards (RS232
pour les communications asynchrones, RS422 pour les communications asynchrones et synchrones,
etc …). Comme les microordinateurs traitent les données en parallèles, il faut convertir chaque octet
de données transmis sous forme sérielle avant de le sortir et inversement, passer de la forme sérielle
à l’octet parallèle en entrée.

UART et USART
UART : Emetteur Récepteur Asynchrone Universel
USART : Emetteur Récepteur Asynchrone et Synchrone Universel

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         33 
 
L’UART a été un des premiers boitiers LSI standardisés. Un UART est un convertisseur série-
parallèle et parallèle-série. Il a deux fonctions :
- Accepter des données en parallèle et les convertir en une série de bits comportant
éventuellement un bit de start, un bit de parité et des bits de stop,
- Prendre une série de bits et la convertir en données parallèles.
La figure FIG. II-20 présente le schéma fonctionnel d’un UART. Tout UART a trois sections : un
émetteur, un récepteur et une section commande.

Entrée série   
Sorties 
Horloge  Récepteur  parallèles 
Validation/RAZ   

 
E/S  Sortie série
Emetteur 
Parallèle 
 

Contrôle 
Fonctions de  Signaux d’état 
commandes 

FIG. II-20 : Structure d’un UART

Les trois méthodes d’Entrée-Sortie

Les composants et les techniques pour l’interface élémentaire des entrées-sorties : nous savons
désormais réaliser des interfaces parallèles ou séries.

Le problème suivant est de gouverner les transferts de données, c’est-à-dire implanter une stratégie
de synchronisation. Trois méthodes de base peuvent être utilisées. Elles vont être décrites brièvement.
Les boitiers qui facilitent chacune de ces stratégies seront également présentés.
Ces trois méthodes sont illustrées sur la figure FIG. II-21. Ce sont les E/S programmées (sondage :
Scrutation), Interruption et DMA (Accès Direct Mémoire). Naturellement, il est possible d’utiliser
des combinaisons de ces méthodes.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         34 
 
Mémoire

Bus de Données
MPU
)

?
E/S E/S
? Scrutation
(Sondage)

Mémoire

MPU
E/S E/S

INT INT INT Interruption

Mémoire DMA
HOLD

MPU

DMA

E/S E/S

FIG. II-21 : Les trois méthodes d’E/S

E/S programmées ou par sondage ("scrutation", en anglais polling)


En entrées-sorties programmées, tous les transferts vers les périphériques, ou venant d’eux,
sont effectués par le programme. Le processeur envoie et demande les données, toute opération d’E/S
est sous le contrôle du programme qui s’exécute. Les transferts doivent être coordonnés par un
processus de "prise de contact" ("handshaking" ou poignée de main). La méthode de base pour
déterminer si une opération est nécessaire, ou possible, est d’avoir recours à des indicateurs ("flags").

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         35 
 
Un indicateur est un bit qui, lorsqu’il est à 1, signifie qu’une condition qui nécessite l’attention s’est
présentée. Par exemple, un indicateur peut signifier "périphérique prêt" c’est-à-dire "tampon plein"
pour un périphérique d’entrée ou "tampon vide" pour un périphérique de sortie.
L’indicateur est continuellement examiné par le programme : c’est le "sondage". La
caractéristique de cette approche est d’utiliser un minimum de hardware au prix d’une forte surcharge
software.

Interruptions
La technique des E/S programmées a deux limitations :
1. Elle fait perdre du temps au processeur puisqu’il examine chaque fois l’état de tous les
périphériques, le plus souvent inutilement.
2. Elle est lente par essence puisqu’on teste l’état de tous les périphériques avant de revenir à
l’un d’entre eux. Cela peut être critiquable dans un système temps réel, où un périphérique
exige d’être servi dans un temps donné. En particulier, quand un système inclut des
périphériques rapides, les E/S programmées peuvent ne pas être assez rapides, tout
simplement pour satisfaire aux exigences minimales de service.

Le sondage est un mécanisme synchrone où les périphériques sont traités à la suite. Les
interruptions constituent un mécanisme asynchrone. Chaque périphérique, ou son contrôleur, est
relié à une ligne d’interruption. Cette ligne transmet une demande d’IT au processeur. Dès qu’un
des périphériques a besoin d’être servi, il génère une impulsion ou un niveau sur cette ligne pour
demander attention de la part du microprocesseur. Le µp examine s’il y a des ITs à la fin de chaque
instruction. S’il y a une IT, il va la traiter. Sinon, il va chercher l’IT suivante. Pendant le cours de
certains processus critiques, il faut garantir que le programme en exécution ne sera pas dérangé
par des ITs externes. Un tel exemple est celui de la routine de panne secteur. Une panne de secteur
peut être facilement détectée par avance. Si le système est muni d’une mémoire à batteries
(onduleur), le processeur peut y préserver le contenu de ses registres puis arrêter le système en
bon ordre (shutdown). Il reste encore normalement quelques millisecondes de temps de traitement
après détection d’une panne secteur. On active alors une routine de panne de secteur qui s’exécute
sans tenir compte des autres demandes d’ITs moins importantes qui peuvent arriver. Les autres
demandes doivent être "masquées". La coupure de courant est considérée comme une IT non
masquable. Tel est le bit de masque (ou registre de masque lorsqu’il y a plusieurs niveaux
possibles) dans le microprocesseur. Quand le masque est mis, les ITs sont ignorées. La possibilité
de masquage s’appelle aussi "inhibition". Une IT est validée lorsqu’elle n’est pas masquée.

Traitement de l’interruption
Une fois que la demande d’IT a été reçue et acceptée par le µp, il faut satisfaire le périphérique.
Pour cela, le µp exécute une routine de service spécialisée. Deux problèmes se posent.
Premièrement, l’état du programme en exécution sur le µp au moment de l’IT doit être préservé.
Cela implique de sauvegarder le contenu de tous les registres du µp. Ces registres seront conservés
dans la pile. Au strict minimum, le pointeur de programme (PC ou CO) doit être copié en haut de
la pile pour pouvoir mettre dans le registre PC une autre adresse : celle du début de la routine de
service de l’IT. La préservation des autres registres peut se faire par hardware par le µp, ou bien
peut être laissée sous la responsabilité de la routine d’IT (c’est-à-dire du programmeur). Une fois
que PC (plus, éventuellement, les autres registres) a été sauvegardé dans la pile, le µp peut se
brancher à l’adresse de la routine de l’IT. C’est là que se pose le second problème : plusieurs

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         36 
 
périphériques sont connectés à la même ligne d’IT. Où doit aller le µp pour traiter l’IT ? Le
problème consiste à identifier lequel des périphériques a demandé l’IT. Cette identification peut
être faite par hardware, par software ou en combinant les deux. Le branchement vers l’adresse
correspondant au périphérique en cause s’appelle la vectorisation de l’IT. Le système le plus
simple du point de vue hardware ne possède pas d’ITs vectorisées. C’est une routine software qui
déterminera que le périphérique a demandé une intervention. On utilisera pour cela le sondage.
La routine d’identification de l’IT interroge chaque périphérique relié au système. Elle examine
son registre d’état en testant généralement le bit 7. La présence d’un "1" signale que ce
périphérique a bien demandé l’IT. Ayant identifié le demandeur, la routine passe alors le contrôle
à la routine de traitement d’IT appropriée. L’ordre suivant lequel les interrogations sont faites
détermine quel périphérique sera servi le premier. Ceci réalise un traitement des priorités par
software pour le cas où plusieurs périphériques peuvent demander une IT en même temps. La
seconde méthode, commandée par software, mais avec un appoint hardware, est nettement plus
rapide. Elle utilise un chainage en cascade ("daisy-chain") pour identifier le périphérique
demandeur d’IT. Ceci est illustré en figure FIG. II-22.

INT 1 à N lignes
INT INT INT

Circuit Circuit Circuit


1 2 N

ACK ACK

Bus de données

FIG. II-22 : Technique de chainage.

Après avoir préservé les registres, le µp génère un signal de prise–en-compte de l’IT. Ce signal est
envoyé au périphérique 1. Si le périphérique 1 a généré l’IT, il place son numéro d’identification sur
le bus de données où il sera lu par le µp. Si ce n’est pas lui qui a généré l’IT, il propage le signal de
prise-en-compte au périphérique 2 qui fera de même et ainsi de suite. A cause de l’arrangement
physique des unités, ce mécanisme d’interconnexion est appelé chainage. Il peut être réalisé avec la
plupart des PIO (Composant E/S parallèles programmable).
La méthode la plus rapide est celle de la vectorisation des ITS. C’est à un circuit externe, ou à un
contrôleur de périphérique qu’échoit la responsabilité de fournir non seulement le signal d’IT mais
aussi l’identité du périphérique cause de l’IT ou mieux encore l’adresse de branchement à la routine
de traitement. Si le contrôleur d’IT ne fournit pas l’identité du périphérique, il reste la tâche software
simple de consulter une table des adresses de branchement pour chaque périphérique. Ceci est plus
simple du point de vue hardware mais n’atteint pas le plus haut niveau de performance. La meilleure
performance est obtenue lorsque le µp reçoit en même temps que l’IT, l’adresse où il doit se brancher.
Il peut alors se rendre directement à l’adresse mémoire voulue et commencer le service du
périphérique. Les boîtiers PIC (Peripheral Interrupt Controller ou Contrôleur de priorités d’IT) en
font maintenant une réalité pratique économique.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         37 
 
Priorités
Un problème supplémentaire se pose : plusieurs ITs peuvent se produire simultanément. Le
µp doit alors décider dans quel ordre il doit les traiter. Une priorité fixe est alors généralement
attribuée à chaque périphérique. Le µp va traiter les périphériques dans l’ordre de leur priorité. Dans
le monde des ordinateurs, le niveau de priorité 0 est le plus élevé, 1 le suivant et ainsi de suite. Par
exemple, en général, le niveau 0 correspondra aux coupures de courant (PFR : Power Fail Restart).
Les priorités peuvent être définies par hardware ou par software. La méthode software a été décrite
ci-dessus. La routine qui interroge les périphériques va simplement interroger en premier le
périphérique le plus prioritaire. La priorité est possible aussi par hardware. Elle est en fait réalisée de
manière interne par le PIC. En plus, ce contrôleur de priorités d’ITs possède un masque qui permet
au programmeur de masquer sélectivement tout niveau d’IT.

Accès Direct Mémoire (DMA)


Les ITs garantissent la réponse la plus rapide possible pour un périphérique. Toutefois, le
service périphérique est fait par software. Cela peut être encore trop lent pour les processus qui
mettent en jeu des transferts mémoire rapides, comme les disques ou les afficheurs à écran
(cathodique, Led, …). Là encore, la solution consiste à remplacer le software par le hardware. La
routine software effectuant le transfert entre la mémoire et le périphérique est remplacée par un
processeur hardware spécialisé, le DMAC ou contrôleur d’Accès Direct Mémoire. Un DMAC est un
processeur spécialisé conçu pour effectuer des transferts rapides entre la mémoire et le périphérique.
Pour effectuer ces transferts, le DMAC exige l’usage à la fois du bus de données et du bus d’adresses.
Les philosophies de DMA diffèrent sur la façon dont elles obtiennent l’accès à ces bus. Par exemple,
un DMAC peut suspendre un processeur, ou l’arrêter, ou il peut voler des cycles mémoire au
processeur, ou encore il peut rallonger les périodes d’horloge. L’approche la plus simple et qui est
habituellement réalisée sur la plupart des µp est de suspendre le fonctionnement du µp. C’est la raison
des circuits (drivers) 3-états utilisés pour les données et les adresses.
Chaque périphérique envoie son interruption au DMAC plutôt qu’au µp. Quand le DMAC
reçoit une IT d’un périphérique, il génère un signal spécial pour le µp, le HOLD. Le signal HOLD
suspend le µp et le met dans un état dormant. Le µp termine son instruction puis abandonne le bus de
données et le bus d’adresse dans l’état haute impédance. Puis il va s’endormir et répond par le signal
"acceptation du HOLD". A la réception du signal "acceptation du HOLD", le DMAC sait que les bus
sont libres. Il va alors placer automatiquement une adresse qui spécifie l’adresse mémoire où un
transfert de données doit avoir lieu. Un DMAC connecté à 8 périphériques contiendra pour cela 8
registres-adresse de 16 bits (ou plus). Naturellement le contenu de ces registres a été spécifié par le
programmeur pour chacun de ces périphériques. Le DMAC spécifie l’adresse à laquelle le transfert
doit avoir lieu puis génère un signal "lecture" ou "écriture" et laisse le périphérique générer ou lire
les données sur le bus de données. En outre un DMAC comporte un mécanisme de séquencement
automatique pour les transferts de blocs (dans le cas d’un disque par exemple). Le DMAC est muni
d’un registre-compteur de n bits, ce qui autorise des transferts automatiques de 1 à 2n mots. Après
chaque transfert de mot, le compteur est décrémenté. Le transfert s’arrête lorsque le compteur arrive
à 0 ou lorsque la requête de DMA cesse.

Chapitre III – Notions sur les instructions d’un ordinateur


Le codage des instructions sous forme de nombres binaires est naturel et efficace pour les
ordinateurs. Les humains, cependant, ont beaucoup de difficulté à comprendre et à manipuler ces
chiffres. Les gens lisent et écrivent beaucoup mieux les symboles (mots) que les longues séquences
Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         38 
 
de chiffres. Les humains peuvent écrire et lire des symboles et les ordinateurs peuvent exécuter les
nombres binaires équivalents.
Ce chapitre décrit le processus par lequel un programme lisible par l'homme est traduit sous une forme
qu'un ordinateur peut exécuter.
III – 1 Langage d’assemblage
Le langage d'assemblage est la représentation symbolique du langage machine de codage binaire d'un
ordinateur. Le langage d'assemblage est plus lisible que le langage machine car il utilise des symboles
au lieu de bits. Les symboles en langage assembleur nomment les modèles de bits courants, tels que
les codes opérations (CODOP) et les spécificateurs de registre, afin que les gens puissent les lire et
s'en souvenir (codes mnémoniques). De plus, le langage assembleur permet aux programmeurs
d'utiliser des étiquettes pour identifier et nommer une mémoire particulière des mots contenant des
instructions ou des données. 

Fichier Assembleur Fichier


objet
source

   
Fichier Assembleur Editeur Fichier
Fichier
de liens exécutable
source objet
(linker)

 
Fichier Assembleur Librairies
Fichier de
objet programmes
source

FIG. III-1 : Processus qui produit un fichier exécutable. Un assembleur traduit un fichier de langage
d'assemblage en un fichier objet, qui est lié à d'autres fichiers et bibliothèques dans un fichier
exécutable.
Un outil appelé assembleur traduit le langage d'assemblage en instructions binaires. Les
assembleurs fournissent une représentation plus conviviale que les 0 et 1 d’un ordinateur, ce qui
simplifie l’écriture et la lecture des programmes. Les noms symboliques des opérations et des
emplacements sont une facette de cette représentation. Une autre facette est les facilités de
programmation qui accroissent la clarté d’un programme. Par exemple, permettent à un programmeur
d'étendre le langage d'assemblage en définissant de nouvelles opérations. Un assembleur lit un seul
fichier source en langage assembleur et produit un fichier objet contenant des instructions machine et
des informations de comptabilité qui permet de combiner plusieurs fichiers objets dans un
programme. La figure FIG. III-1 illustre comment un programme est construit. La plupart des

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         39 
 
programmes se composent de plusieurs fichiers, également appelés modules, écrits, compilés et
assemblés indépendamment. Un programme peut également utiliser des routines pré-écrites fournies
dans une bibliothèque de programmes. Un module contient généralement des références à des sous-
programmes et des données définis dans d'autres modules et dans des bibliothèques. Le code d'un
module ne peut pas être exécuté lorsqu'il contient des références non résolues à des étiquettes dans
d'autres fichiers objets ou bibliothèques. Un autre outil, appelé un éditeur de liens, combine une
collection d'objets et de fichiers de bibliothèque dans un fichier exécutable qu'un ordinateur peut
exécuter. Pour voir l'avantage du langage assembleur, considérez la séquence de figures suivantes,
qui contiennent toutes un court sous-programme qui calcule et imprime la somme des carrés des
nombres entiers de 0 à 100. La Figure FIG. III-2 montre le langage machine qu'une machine MIPS
exécute.
00100111101111011111111111100000
10101111101111110000000000010100
10101111101001000000000000100000
10101111101001010000000000100100
10101111101000000000000000011000
10101111101000000000000000011100
10001111101011100000000000011100
10001111101110000000000000011000
00000001110011100000000000011001
00100101110010000000000000000001
00101001000000010000000001100101
10101111101010000000000000011100
00000000000000000111100000010010
00000011000011111100100000100001
00010100001000001111111111110111
10101111101110010000000000011000
00111100000001000001000000000000
10001111101001010000000000011000
00001100000100000000000011101100
00100100100001000000010000110000
10001111101111110000000000010100
00100111101111010000000000100000
00000011111000000000000000001000
00000000000000000001000000100001

Figure FIG. III-2 Code de langage machine MIPS pour une routine permettant de calculer et
d'imprimer la somme des carrés d'entiers compris entre 0 et 100.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         40 
 
Avec un effort considérable, vous pouvez utiliser les tableaux des codes d'opérations et des formats
d'instructions (fiche technique du constructeur) pour traduire les instructions en un programme
symbolique similaire à la FIG. III-3.

addiu $29, $29, -32


sw $31, 20($29)
sw $4, 32($29)
sw $5, 36($29)
sw $0, 24($29)
sw $0, 28($29)
lw $14, 28($29)
lw $24, 24($29)
multu $14, $14
addiu $8, $14, 1
slti $1, $8, 101
sw $8, 28($29)
mflo $15
addu $25, $24, $15
bne $1, $0, -9
sw $25, 24($29)
lui $4, 4096
lw $5, 24($29)
jal 1048 812
addiu $4, $4, 1072
lw $31, 20($29)
addiu $29, $29, 32
jr $31
move $2, $0
FIG. III-3 La même routine écrite en langage assembleur. Cependant, le code du sous-programme
n'étiquette pas les registres ou les emplacements de mémoire et n'inclut pas de commentaires.
Cette forme de routine est beaucoup plus facile à lire car les opérations et les opérandes sont écrits
avec des symboles plutôt qu'avec des modèles de bits. Cependant, ce langage d'assemblage est
toujours difficile à suivre car les emplacements de mémoire sont nommés par leur adresse plutôt que
par une étiquette symbolique.
FIG. III-4 montre le langage d'assemblage qui étiquette les adresses mémoire avec des noms
mnémotechniques.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         41 
 
.text
.align 2
.globl main
main:
subu $sp, $sp, 32 sw $ra, 20($sp)
sd $a0, 32($sp)
sw $0, 24($sp)
sw $0, 28($sp)
loop :
lw $t6, 28($sp)
mul $t7, $t6, $t6
lw $t8, 24($sp) addu $t9, $t8, $t7 sw $t9, 24($sp)
addu $t0, $t6, 1
sw $t0, 28($sp)
ble $t0, 100, loop
la $a0, str
lw $a1, 24($sp)
jal printf
move $v0, $0
lw $ra, 20($sp) addu $sp, $sp, 32
j $ra
.data
.align 0
str:
.asciiz "The sum from 0 .. 100 is %d\n"

FIG. III-4 La même routine écrite en langage d'assemblage avec des étiquettes, mais pas de
commentaires. Les commandes qui commencent par des points sont des directives assembleur. .text
indique que les lignes suivantes contiennent des instructions. .data indique qu'ils contiennent des
données. .align n indique que les éléments des lignes suivantes doivent être alignés sur une limite
de 2n octets. Par conséquent, .align 2 signifie que l'élément suivant doit être sur une limite de mot.
.globl main déclare que main est un symbole global qui devrait être visible pour le code stocké dans
d'autres fichiers. Enfin, .asciiz stocke une chaîne terminée par un null en mémoire.

La plupart des programmeurs préfèrent lire et écrire sous cette forme. Les noms qui
commencent par un point, par exemple .data et .globl, sont des directives d'assembleur qui indiquent
à l'assembleur comment traduire un programme mais ne produisent pas d'instructions machine. Les
noms suivis de deux points, tels que str ou main, sont des étiquettes qui nomment l'emplacement
mémoire suivant. Ce programme est aussi lisible que la plupart des programmes en langage
assembleur (à l'exception d'un manque flagrant de commentaires), mais il est toujours difficile à
suivre car de nombreuses opérations simples sont nécessaires pour accomplir des tâches simples et
parce que le manque de constructions de flux de contrôle du langage assembleur fournit peu d'indices
sur le fonctionnement du programme. En revanche, la routine C de la figure FIG. III-5 est à la fois
Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         42 
 
plus courte et plus claire car les variables ont des noms mnémoniques et la boucle est explicite plutôt
que construite avec des branches.

#include <stdio.h>
int
main (int argc, char *argv[])
{
int i;
int sum = 0;
for (i = 0; i <= 100; i = i + 1) sum = sum + i * i;
printf ("The sum from 0 .. 100 is %d\n", sum);
}

FIG. III-5 La routine écrite dans le langage de programmation C.

En fait, la routine C est la seule que nous ayons écrite. Les autres formes du programme ont
été produites par un compilateur et un assembleur C. En général, le langage d'assemblage joue deux
rôles (Voir FIG. III-6).

Programme en langage de haut niveau

Programme Compilateur Assembleur  Editeur de 


Liens  Ordinateur

Programme en langage d’assemblage

FIG. III-6 Le langage d'assemblage est soit écrit par un programmeur, soit la sortie d'un
compilateur.

Le premier rôle est le langage de sortie des compilateurs. Un compilateur traduit un


programme écrit dans un langage de haut niveau (tel que C ou C++) en un programme équivalent en
langage machine ou assembleur. Le langage de haut niveau est appelé le langage source et la sortie
du compilateur est son langage cible. L'autre rôle du langage d'assemblage est celui d'un langage dans
lequel on écrit des programmes. Ce rôle était autrefois le rôle dominant. Aujourd'hui, cependant, en
raison de plus grandes mémoires principales et de meilleurs compilateurs, la plupart des
programmeurs écrivent dans un langage de haut niveau et voient rarement, voire jamais, les
instructions exécutées par un ordinateur. Néanmoins, le langage assembleur est toujours important
pour écrire des programmes dans lesquels la vitesse ou la taille sont critiques ou pour exploiter des
fonctionnalités matérielles qui n'ont pas d'analogues dans les langages de haut niveau. Bien que cette
partie se concentre sur le langage d'assemblage MIPS, la programmation d'assemblage sur la plupart
des autres machines est très similaire. Les instructions supplémentaires et les modes d'adresse des
machines CISC peuvent raccourcir les programmes d'assemblage mais ne modifient pas le processus
d'assemblage d'un programme ou fournissent un langage d'assemblage avec les avantages des
langages de haut niveau tels que la vérification de type et le flux de contrôle structuré.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         43 
 
Quand utiliser le langage d'assemblage ?
La principale raison de programmer en langage assembleur, par opposition à un langage de
haut niveau disponible, est que la vitesse ou la taille d'un programme sont d'une importance cruciale.
Prenons par exemple un ordinateur qui contrôle une machine, comme les freins d’une voiture. Un
ordinateur incorporé dans un autre appareil, comme une voiture, est appelé un ordinateur embarqué.
Ce type d'ordinateur doit répondre rapidement et de manière prévisible aux événements du monde
extérieur. Parce qu'un compilateur introduit une incertitude sur le coût en temps des opérations, les
programmeurs peuvent avoir du mal à garantir qu'un programme de langage de haut niveau répond
dans un intervalle de temps défini, par exemple 1 milliseconde après qu'un capteur détecte qu'un pneu
dérape. Un programmeur en langage assembleur, en revanche, a un contrôle strict sur les instructions
exécutées. En outre, dans les applications embarquées, la réduction de la taille d’un programme, afin
qu’il puisse contenir moins de zones mémoire, réduit le coût du système embarqué. Une approche
hybride, dans laquelle la majeure partie d'un programme est écrite dans un langage de haut niveau et
les sections critiques dans le temps sont écrites en langage d'assemblage, s'appuie sur les atouts des
deux langages. Les programmes passent généralement la plupart de leur temps à exécuter une petite
fraction du code source du programme. Cette observation n'est que le principe de localité qui sous-
tend les caches (voir chapitre II, section). La trace du programme nous renseigne où un programme
passe son temps et peut nous montrer les parties critiques d'un programme. Dans de nombreux cas,
cette partie du programme peut être rendue plus rapide avec de meilleures structures de données ou
algorithmes. Parfois, cependant, des améliorations significatives des performances proviennent
uniquement du recodage d'une partie critique d'un programme en langage assembleur.
Les compilateurs sont généralement meilleurs que les programmeurs pour produire un code
machine uniforme de haute qualité sur l'ensemble d'un programme. Les programmeurs, cependant,
comprennent les algorithmes et le comportement d’un programme à un niveau plus profond qu’un
compilateur et peuvent consacrer des efforts et de l’ingéniosité considérables à l’amélioration de
petites sections du programme. En particulier, les programmeurs considèrent souvent plusieurs
procédures simultanément lors de l'écriture de leur code. Les compilateurs compilent généralement
chaque procédure de manière isolée et doivent suivre des conventions strictes régissant l'utilisation
des registres aux limites des procédures. En conservant les valeurs couramment utilisées dans les
registres, même au-delà des limites de procédure, les programmeurs peuvent accélérer l'exécution
d'un programme. Un autre avantage majeur du langage d'assemblage est la possibilité d'exploiter des
instructions spécialisées, par exemple, des instructions de copie de chaîne ou de correspondance de
modèles. Les compilateurs, dans la plupart des cas, ne peuvent pas déterminer qu'une boucle de
programme peut être remplacée par une seule instruction. Cependant, le programmeur qui a écrit la
boucle peut la remplacer facilement par une seule instruction. À l’avenir, l’avantage d’un
programmeur sur un compilateur deviendra probablement de plus en plus difficile à maintenir à
mesure que les techniques de compilation s’améliorent et que les pipelines des machines deviennent
de plus en plus complexes. La dernière raison d'utiliser le langage d'assemblage est qu'aucun langage
de haut niveau n'est disponible sur un ordinateur particulier. De nombreux ordinateurs plus anciens
ou spécialisés n’ont pas de compilateur. La seule alternative du programmeur est donc le langage
assembleur.
Inconvénients du langage d'assemblage
Le langage d'assemblage présente de nombreux inconvénients qui plaident fortement contre
son utilisation généralisée. Son principal inconvénient est peut-être que les programmes écrits en
langage assembleur sont intrinsèquement spécifiques à la machine et doivent être totalement réécrits

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         44 
 
pour fonctionner sur une autre architecture d'ordinateur. L'évolution rapide des ordinateurs signifie
que les architectures deviennent obsolètes. Un programme en langage assembleur reste étroitement
lié à son architecture d'origine, même après que l'ordinateur soit éclipsé par de nouveaux, machines
plus rapides et plus rentables. Un autre inconvénient est que les programmes en langage assembleur
sont plus longs que les programmes équivalents écrits dans un langage de haut niveau. Par exemple,
le programme C de la figure FIG. III-5 fait 9 lignes, tandis que le programme d'assemblage de la FIG.
III-4 fait 25 lignes. Dans les programmes plus complexes, le rapport d'assemblage au langage de haut
niveau (son facteur d'expansion) peut être beaucoup plus grand que le facteur de presque trois dans
cet exemple. Malheureusement, des études empiriques ont montré que les programmeurs écrivent à
peu près le même nombre de lignes de code par jour en assemblage comme dans les langages de haut
niveau. Cela signifie que les programmeurs sont environ x fois plus productifs dans un langage de
haut niveau, où x est le facteur d'expansion du langage d'assemblage.
Pour aggraver le problème, les programmes plus longs sont plus difficiles à lire et à
comprendre et ils contiennent plus de bogues. Le langage d'assemblage aggrave le problème en raison
de son manque total de structure. Les idiomes de programmation courants, tels que les instructions
if-then et les boucles, doivent être construits à partir de branches et de sauts. Les programmes
résultants sont difficiles à lire car le lecteur doit reconstruire chaque construction de niveau supérieur
à partir de ses éléments et chaque instance d'une instruction peut être légèrement différente. Les
compilateurs peuvent produire directement un langage machine au lieu de s'appuyer sur un
assembleur. Ces compilateurs s'exécutent généralement beaucoup plus rapidement que ceux qui
invoquent un assembleur dans le cadre de la compilation. Cependant, un compilateur qui génère un
langage machine doit effectuer de nombreuses tâches qu'un assembleur gère normalement, telles que
la résolution d'adresses et le codage des instructions sous forme de nombres binaires. Le compromis
est entre la vitesse de compilation et la simplicité du compilateur.
Malgré ces considérations, certaines applications embarquées sont écrites dans un langage de
haut niveau. Beaucoup de ces applications sont des programmes volumineux et complexes qui
doivent être extrêmement fiables. Les programmes de langage d'assemblage sont plus longs et plus
difficiles à 'écrire et à lire que des programmes de haut niveau. Cela augmente considérablement le
coût d'écriture d'un programme en langage assembleur et rend extrêmement difficile la vérification
de l'exactitude de ce type de programme.
Assembleurs
Un assembleur traduit un fichier d'instructions en langage assembleur en un fichier
d'instructions machine binaires et de données binaires. Le processus de traduction comprend deux
parties (deux phases) principales. La première étape consiste à trouver des emplacements de mémoire
avec des étiquettes afin que la relation entre les noms symboliques et les adresses soit connue lorsque
les instructions sont traduites. La deuxième étape consiste à traduire chaque instruction d'assemblage
en combinant les équivalents numériques des opcodes, des spécificateurs de registre et des étiquettes
dans une instruction légale. Comme le montre la figure FIG. III-1, l'assembleur produit un fichier de
sortie, appelé fichier objet, qui contient les instructions de la machine, les données et les informations
de comptabilité.
Un fichier objet ne peut généralement pas être exécuté car il fait référence à des procédures
ou à des données dans d'autres fichiers. Une étiquette est externe (également appelée globale) si l'objet
étiqueté peut être référencé à partir de fichiers autres que celui dans lequel il est défini. Une étiquette
est locale si l'objet ne peut être utilisé que dans le fichier dans lequel il est défini. Dans la plupart des

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         45 
 
assembleurs, les étiquettes sont locales par défaut et doivent être explicitement déclarées globales.
Les sous-programmes et les variables globales nécessitent des étiquettes externes car ils sont
référencés à partir de nombreux fichiers dans un programme. Les étiquettes locales masquent les
noms qui ne devraient pas être visibles par d'autres modules, par exemple, les fonctions statiques en
C, qui ne peuvent être appelées que par d'autres fonctions du même fichier. De plus, les noms générés
par le compilateur - par exemple, un nom pour l'instruction au début d'une boucle - sont locaux, de
sorte que le compilateur n'a pas besoin de produire des noms uniques dans chaque fichier.
Etiquettes locales et globales
Exemple :
Considérez le programme de la figure FIG. III-4 à la page 42. Le sous-programme a une
étiquette externe (globale) main. Il contient également deux étiquettes locales - loop et str - qui ne
sont visibles qu'avec ce fichier de langage d'assemblage. Enfin, la routine contient également une
référence non résolue à une étiquette externe printf, qui est la routine de bibliothèque qui imprime les
valeurs. Quelles étiquettes de la figure FIG. III-4 pourraient être référencées à partir d'un autre fichier
?
Réponse :
Seules les étiquettes globales sont visibles en dehors d'un fichier, donc la seule étiquette qui
pourrait être référencée à partir d'un autre fichier est main.
Étant donné que l'assembleur traite chaque fichier dans un programme individuellement et
isolément, il ne connaît que les adresses des étiquettes locales. L'assembleur dépend d'un autre outil,
l'éditeur de liens, pour combiner une collection de fichiers objets et de bibliothèques dans un fichier
exécutable en résolvant des étiquettes externes. L'assembleur assiste l'éditeur de liens en fournissant
des listes d'étiquettes et de références non résolues.
Cependant, même les étiquettes locales présentent un défi intéressant pour un assembleur.
Contrairement aux noms de la plupart des langages de haut niveau, les étiquettes d'assemblage
peuvent être utilisées avant d'être définies. Dans l'exemple de la figure FIG. III-4, l'étiquette str est
utilisée par l'instruction la avant d'être définie. La possibilité d'une référence directe, comme celle-
ci, oblige un assembleur à traduire un programme en deux étapes : trouver d'abord toutes les étiquettes
et ensuite produire des instructions. Dans l'exemple, lorsque l'assembleur voit l’instruction la, il ne
sait pas où se trouve le mot étiqueté str ou même si str est une étiquette d’une instruction ou d’une
donnée.
Le premier passage d'un assembleur lit chaque ligne d'un fichier d'assemblage et le divise en ses
composants. Ces éléments, appelés lexèmes (unité minimale de signification, par opposition à
morphème unité minimale d’analyse grammaticale, par exemple compt. est un lexème qui peut
signifier compte, comptage, compter etc) sont des mots individuels, des nombres et des caractères de
ponctuation. Par exemple, la ligne :

ble $t0, 100, loop

contient 6 lexèmes : l'opcode ble, le spécificateur de registre $ t0, une virgule, le nombre 100, une
virgule et le symbole loop.

Si une ligne commence par une étiquette, l'assembleur enregistre dans sa table de symboles le
nom de l'étiquette et l'adresse du mot mémoire qu'occupe l'instruction. L'assembleur calcule alors

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         46 
 
combien de mots de mémoire l'instruction sur la ligne courante occupera. En gardant une trace des
tailles des instructions, l'assembleur peut déterminer où va l'instruction suivante.
L'assembleur utilise les informations de la table des symboles lors d'un deuxième passage (2ème phase)
sur le fichier, qui produit en fait du code machine. L'assembleur examine à nouveau chaque ligne du
fichier. Si la ligne contient une instruction, l'assembleur combine les représentations binaires de son
opcode et des opérandes (spécificateurs de registre ou adresse mémoire) dans une instruction légale.
Les instructions et les mots de données qui font référence à un symbole externe défini dans un autre
fichier ne peuvent pas être complètement assemblés (ils ne sont pas résolus) car l'adresse du symbole
ne se trouve pas dans la table des symboles. Un assembleur ne se plaint pas des références non
résolues car l'étiquette correspondante est susceptible d'être définie dans un autre fichier.

Si la vitesse d’un assembleur est importante, ce processus en deux étapes peut être effectué en
un seul passage sur le fichier d’assemblage avec une technique appelée backpatching (retour
correction). Lors de son passage sur le fichier, l'assembleur construit une représentation binaire
(éventuellement incomplète) de chaque instruction. Si l'instruction fait référence à une étiquette qui
n'a pas encore été définie, l'assembleur enregistre l'étiquette et l'instruction dans une table. Lorsqu'une
étiquette est définie, l'assembleur consulte cette table pour trouver toutes les instructions qui
contiennent une référence directe à l'étiquette. L'assembleur revient en arrière et corrige leur
représentation binaire pour incorporer l'adresse de l'étiquette. Le backpatching accélère
l'assemblage car l'assembleur ne lit qu'une seule fois son entrée. Cependant, il faut qu'un assembleur
conserve la représentation binaire entière d'un programme en mémoire afin que les instructions
puissent être rétrocédées. Cette exigence peut limiter la taille des programmes pouvant être assemblés.

Format du fichier objet


Les assembleurs produisent des fichiers objets. Un fichier objet sous Unix contient six sections
distinctes (voir Figure FIG. III-7) :

Entête du fichier Segment texte Segment de données Information Table des Symboles Information

Objet sur la relocalisation de débogage

Figure FIG. III-7 Fichier objet. Un assembleur Unix produit un fichier objet avec six
sections distinctes.

- L'en-tête du fichier objet décrit la taille et la position des autres éléments du fichier.
- Le segment de texte contient le code de langage machine pour les routines dans le fichier
source. Ces routines peuvent ne pas être exécutables en raison de références non résolues.
- Le segment de données contient une représentation binaire des données dans le fichier
source. Les données peuvent également être incomplètes en raison des références non
résolues à des étiquettes dans d'autres fichiers.
- Les informations de déplacement identifient les instructions et les mots de données qui
dépendent d'adresses absolues. Ces références doivent changer si des parties du
programme sont déplacées en mémoire.
- La table des symboles associe des adresses à des étiquettes externes dans le fichier source
et répertorie les références non résolues.
- Les informations de débogage contiennent une description concise de la manière dont le
programme a été compilé, afin qu'un débogueur puisse trouver quelles adresses

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         47 
 
d'instructions correspondent aux lignes d'un fichier source et imprimer les structures de
données sous forme lisible.

L'assembleur produit un fichier objet qui contient une représentation binaire du programme et
des données et des informations supplémentaires pour aider à lier des éléments d'un programme. Ces
informations de déplacement sont nécessaires car l'assembleur ne sait pas quels emplacements de
mémoire une procédure ou un élément de données occupera après avoir été lié au reste du programme.
Les procédures et les données d'un fichier sont stockées dans une partie contiguë de la mémoire, mais
l'assembleur ne sait pas où cette mémoire sera située. L'assembleur transmet également certaines
entrées de la table des symboles à l'éditeur de liens. En particulier, l'assembleur doit enregistrer quels
symboles externes sont définis dans un fichier et quelles références non résolues se produisent dans
un fichier.

Pour plus de commodité, les assembleurs supposent que chaque fichier commence à la même
adresse (par exemple, l'emplacement 0) avec l'espoir que l'éditeur de liens relocalisera le code et les
données lorsqu'ils se verront attribuer des emplacements en mémoire. L'assembleur produit des
informations de relocalisation, qui contiennent une entrée décrivant chaque instruction ou mot de
données dans le fichier qui référence une adresse absolue. Sur MIPS, seules les instructions d'appel,
de chargement et de stockage de sous-programme font référence à des adresses absolues. Les
instructions qui utilisent l'adressage relatif au PC, telles que les branchements, n'ont pas besoin d'être
déplacées.
 
Ajouts supplémentaires
Les assembleurs fournissent une variété de fonctionnalités pratiques qui aident à rendre les
programmes assembleurs plus courts et plus faciles à écrire, mais ne changent pas fondamentalement
le langage d'assemblage. Par exemple, les directives de mise en page des données permettent à un
programmeur de décrire les données d'une manière plus concise et naturelle que sa représentation
binaire.
Dans la figure FIG. III-4, la directive

.asciiz “The sum from 0 .. 100 is %d\n”

stocke les caractères de la chaîne en mémoire. La directive .asciiz est plus facile à lire car elle
représente les caractères sous forme de lettres et non de nombres binaires. Un assembleur peut traduire
des caractères en leur représentation binaire beaucoup plus rapidement et avec plus de précision qu'un
humain. Les directives de mise en page des données spécifient les données sous une forme lisible par
l'homme que l'assembleur traduit en binaire.
Les macros sont une fonction de correspondance et de remplacement de modèle qui fournit
un mécanisme simple pour nommer une séquence d'instructions fréquemment utilisée. Au lieu de
taper à plusieurs reprises les mêmes instructions à chaque fois qu'elles sont utilisées, un programmeur
appelle la macro et l'assembleur remplace l'appel de macro par la séquence correspondante
d'instructions. Les macros, comme les sous-programmes, permettent à un programmeur de créer et
de nommer une nouvelle abstraction pour une opération courante. À la différence des sous-
programmes, cependant, les macros ne provoquent pas d’appel de sous-programme et retournent
lorsque le programme s’exécute, car un appel de macro est remplacé par le corps de la macro lorsque
le programme est assemblé. Après ce remplacement, le résultat d’assemblage est impossible à
distinguer du programme équivalent écrit sans macros.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         48 
 
III - 2 Editeur de liens (Linker en anglais)
La compilation séparée permet à un programme d'être divisé en modules qui sont stockés dans
différents fichiers. Chaque fichier contient une collection logiquement liée de sous-programmes et de
structures de données qui forment un module dans un programme plus volumineux. Un fichier peut
être compilé et assemblé indépendamment des autres fichiers, de sorte que les modifications
apportées à un module ne nécessitent pas de recompiler l'ensemble du programme. Comme nous
l'avons vu ci-dessus, une compilation séparée nécessite l'étape supplémentaire de liaison pour
combiner l'objet fichiers de modules séparés et corrigez leurs références non résolues.
L'outil qui fusionne ces fichiers est l'éditeur de liens. Il effectue trois tâches :
- Recherche les bibliothèques de programmes pour trouver les routines de bibliothèque
utilisées par le programme,
- Détermine les emplacements mémoire que le code de chaque module occupera et
repositionne ses instructions en ajustant les références absolues,
- Résout les références parmi les fichiers.

La première tâche d’un éditeur de liens est de s’assurer qu’un programme ne contient aucune étiquette
indéfinie. L'éditeur de liens fait correspondre les symboles externes et les références non résolues des
fichiers d'un programme. Un symbole externe dans un fichier résout une référence d'un autre fichier
si les deux font référence à une étiquette portant le même nom. Des références sans correspondance
signifient qu'un symbole a été utilisé, mais n'a été défini nulle part dans le programme. Les références
non résolues à ce stade du processus de liaison ne signifient pas nécessairement qu'un programmeur
a commis une erreur. Le programme aurait pu référencer une routine de bibliothèque dont le code ne
figurait pas dans les fichiers objets transmis à l'éditeur de liens. Après avoir fait correspondre les
symboles dans le programme, l'éditeur de liens recherche les bibliothèques de programmes du
système pour trouver des sous-programmes et des structures de données prédéfinis que les références
du programme. Les bibliothèques de base contiennent des routines qui lisent et écrivent des données,
allouent et désallouent de la mémoire et effectuent des opérations numériques. D'autres bibliothèques
contiennent des routines pour accéder à une base de données ou manipuler les fenêtres de terminal.
Un programme qui référence un symbole non résolu qui ne se trouve dans aucune bibliothèque est
erroné et ne peut pas être lié. Lorsque le programme utilise une routine de bibliothèque, l'éditeur de
liens extrait le code de la routine de la bibliothèque et l'incorpore dans le programme segment de
texte. Cette nouvelle routine, à son tour, peut dépendre d'une autre bibliothèque routines, de sorte que
l'éditeur de liens continue d'extraire d'autres routines de bibliothèque jusqu'à ce qu'aucune référence
externe ne soit non résolue ou qu'une routine ne soit pas trouvée. Si toutes les références externes
sont résolues, l'éditeur de liens détermine ensuite les emplacements de mémoire que chaque module
occupera. Les fichiers étant assemblés de manière isolée, l’assembleur ne pouvait pas savoir où les
instructions ou les données d’un module seraient placées par rapport aux autres modules. Lorsque
l'éditeur de liens place un module en mémoire, toutes les références absolues doivent être déplacées
pour refléter son emplacement réel. Étant donné que l'éditeur de liens a des informations de
relocalisation qui identifient toutes les références relocalisables, il peut trouver et rétrocéder
efficacement ces références. L'éditeur de liens produit un fichier exécutable qui peut s'exécuter sur
un ordinateur. En règle générale, ce fichier a le même format qu'un fichier objet, sauf qu'il ne contient
aucune référence non résolue ni aucune information de déplacement.

III - 3 Le Chargeur (Loader en anglais)


Un programme qui établit des liens sans erreur peut être exécuté. Avant d'être exécuté, le
programme réside dans un fichier sur un stockage secondaire, tel qu'un disque. Sur les systèmes Unix,
le noyau du système d'exploitation met un programme en mémoire et le lance. Pour démarrer un
programme, le système d'exploitation effectue les étapes suivantes :

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         49 
 
- Lit l'en-tête du fichier exécutable pour déterminer la taille des segments de texte et de
données.
- Crée un nouvel espace d'adressage pour le programme. Cet espace d'adressage est
suffisamment grand pour contenir les segments de texte et de données, ainsi qu'un segment
de pile.
- Copie les instructions et les données du fichier exécutable dans le nouvel espace
d'adressage.
- Copie dans la pile les arguments passés au programme.
- Initialise les registres de la machine. En général, la plupart des registres sont effacés, mais
le pointeur de pile doit recevoir l'adresse du premier emplacement de pile libre.
- Passe à une routine de démarrage qui copie les arguments du programme depuis la pile
dans les registres et appelle la routine main du programme. A la fin de la routine main,
la routine de démarrage termine le programme avec un appel système de sortie.

III - 4 Instructions machines usuelles

On regroupe les instructions usuelles machines d’un processeur en quatre familles :

Traitement
- Cette famille correspond aux opérations arithmétiques (addition, soustraction, …) et
logiques (et, ou, …).

Transferts des données avec la mémoire


- Dans cette famille on retrouve les instructions de chargement et de rangement (Load,
Store).

Contrôle
- La troisième famille est relative aux
- Instructions de branchements (conditionnelles, inconditionnelles)
- Instructions de branchements aux sous programmes, aux fonctions, …
(Sauvegarde automatique de l’adresse de retour dans une pile).

Système
- Enfin dans la quatrième partie, on trouve les instructions relatives aux interruptions
logicielles (SWI) ou matérielles : Appel de fonctions du Système d’exploitation,
exceptions.

Les instructions servent à effectuer des opérations sur les données et à effectuer des sauts de
programme conformément aux algorithmes de calcul. De façon à effectuer les calculs en interne et
ne pas à aller chercher systématiquement les données en mémoire, les instructions LOAD et
STORE servent respectivement à pré charger des registres données et à sauvegarder les résultats
en mémoire. Certains processeurs disposent d’instructions facilitant la mise au point ou l’utilisation
de système d’exploitation multi tâches. C’est le cas des exceptions logicielles permettant au
processeur de changer de mode* (mode superviseur ou utilisateur). Par exemple, les appels
systèmes pour effectuer un traitement sur des processus du noyau de l’OS, peuvent utiliser ce type
d’instruction.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         50 
 
*Chaque mode correspond à des ressources propres :
• permet la mise en place de protection pour les OS,
• Il existe au moins 2 modes : Superviseur et Utilisateur,
• Les ressources propres sont généralement des registres : PC ou CO, pointeur de pile,
• Le passage d’un mode à un autre s’effectue par des exceptions (interruption logicielle ou
matérielle)

Les exceptions permettent de signaler un événement particulier au processeur pour qu'il effectue
un traitement spécifique. Elles peuvent être générées par :
• Interruption logicielle (instruction d’appel système)
• Interruption matérielle (un signal d’interruption extérieur devient actif)
• Dysfonctionnement du système (échec d’un accès mémoire, instruction non reconnue,…)

Les instructions possèdent des modes d’adressage, c’est-à-dire la manière d’aller chercher un
opérande ou une donnée. Pour cela, on dispose de cinq modes d’adressage :

Mode Accès aux données de l’instruction


Immédiat Donnée elle-même
Absolu Adresse de la donnée
Registre Numéro de Registre
Registre indirect numéro de registre contenant l’adresse de la donnée (registre d'adresse)
Indirect Adresse d’une adresse de la donnée

La donnée peut être directement indiquée dans l’instruction, ce qui correspond à l’adressage
immédiat. Ce mode d’adressage présente les inconvénients suivants :
• Mot d’instruction long pour rajouter le champ donnée
• Un même programme ne peut pas être utilisé pour plusieurs listes de données.
• Une même liste de donnée ne peut pas être traitée par différents programmes
Pour les 2 derniers points, il est préférable d’indiquer l’adresse de la donnée dans l’instruction (mode
d’adressage absolu). Pour réduire la taille de l’instruction, certains processeurs considèrent la
différence d’adresse qui les sépare avec le compteur programme de l’instruction (adressage relatif).
Si ce sont des registres internes qui contiennent les données, le mot instruction est encore
réduit car il suffit de donner le numéro du registre.
Si la donnée est en mémoire, un registre peut servir de pointeur ou de registre d’adresse (mode
d’adressage indirect). Dans ce cas l’instruction ne contient que l’indice de ce registre d’adresse et
le processeur va effectuer un cycle supplémentaire pour accéder à la donnée en mémoire adressée
par ce registre d’adresse.

III - 5 Phases d’exécution d’une instruction

Une instruction machine passe par trois phases : Recherche – décodage – Exécution.
La technique du pipeline – ou anticipation dans le processeur – repose sur le découpage de
l’instruction en sous-ensembles logiques élémentaires ou micro opérations de longueur fixe, de type
recherche, décodage, exécution.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         51 
 
Sans utilisation du pipeline

Une période d’horloge

Recherche Décodage Exécution 3 cycles/Instruction

L’utilisation du pipeline donne les étapes suivantes :

Recherche Décodage Exécution


Instruction 1 1 cycle/Instruction

Recherche Décodage Exécution


Instruction 2

Recherche Décodage Exécution


Instruction 3

Recherche Décodage Exécution


Instruction 4

FIG. III-5 : Phases d’une instruction à travers un pipeline.

Sans la technique du pipeline, l’instruction dans ce cas de figure nécessite 3 cycles d’horloge pour
son exécution. Le pipeline d'instruction permet d'exécuter une nouvelle instruction à chaque cycle
d'horloge. Dans cet exemple, il y a 3 étapes : Recherche, Décodage et Exécution.
Lors de l'étape 3, l'instruction 3 est dans la phase recherche, alors que l'instruction 2 est décodée et
l'instruction 1 est exécutée. Au cycle d'après c'est l'instruction 2 qui sera exécutée. Les instructions
ont toujours besoin de 3 étapes mais le débit d'instruction est au rythme de l'horloge.

III - 6 Pipeline

Définition
Le "pipelining" est une technique de décompositions répétitives d'un processus en sous
processus, chacun d'eux est destiné à une tâche, et ces sous processus peuvent opérer en même
temps.
Ex : chaîne de montage automobiles.
Où se situe le pipeline ?
- Au niveau système. A la conception de l'unité de traitement des instructions :
- phase de recherche instruction,
- décodage instruction,
- Exécution.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         52 
 
- Au niveau sous-système :
- unité arithmétique et logique.

Configurations du pipeline
- pipeline statique,
- pipeline dynamique.

Fonctions du pipeline
- unifonction,
- multifonction.

Considérations de performance
a- Rendement :
Le rendement d'un pipeline est déterminé par l'étage (module) le plus lent (goulet
d'étranglement) ; où le rendement de ce pipeline est obtenu en divisant le nombre
d'étages lents du pipeline par le temps de l'étage le plus lent.
b- Efficacité (ou facteur d'utilisation)
L'efficacité d'un pipeline est égale à la somme des tranches de temps des tâches sur la
somme des espaces tranches de temps de tous les modules (étages).
Fréquences d'impulsion et limitation de vitesse
Les étages d'un pipeline doivent être synchronisés par la même horloge pour la
propagation des données à travers le pipeline. Le rendement est limité par les délais de
propagation à travers les couches logiques. Trois conditions nécessaires sont à prendre
en compte :
- la donnée doit être déclenchée par impulsions d'horloge assez larges pour assurer
proprement une sortie stabilisée,
- l'impulsion ne doit pas être très large pour ne pas permettre à la donnée de passer à
travers deux ou plusieurs étages avec la même horloge, la donnée qui doit passer à
travers un étage devra arriver avant le prochain top d'horloge.

III – 7 Unité de commandes


L’unité de commandes est soit câblée ou micro programmée. Une unité de commandes câblée
est constituée d’un décodeur constitué de circuits logiques et séquentiels qui délivre des signaux de
commandes (micros commandes) à destination du registre Instruction, compteur ordinal, de l’UAL,
du registre Codes Conditions et d’autres registres à usage général ou particulier. Quant à une unité de
commandes micro programmée, elle possède, en son sein, une ROM (au lieu d’un décodeur câblé)
contenant des micros instructions. Chaque micro instruction délivre des micros commandes à
destination du registre Instruction, compteur ordinal, de l’UAL, du registre Codes Conditions et
d’autres registres à usage général ou particulier. Le code d’une instruction machine sert d’adresse
d’accès à cette ROM qui délivre des micros instructions qui correspondent à l’instruction machine.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         53 
 
III - 8 Le séquenceur
Le séquenceur est sous l’emprise de l’unité de commande et fournit le timing nécessaire aux
instructions machines. Il est piloté par une horloge de fréquence F (c’est-à-dire de cycle 1/F) qui
s’exprime généralement en Ghz. L’horloge n’est rien d’autre qu’un quartz qui délivre un train
d’impulsions carrées (Tops d’horloge). La distance entre deux tops d’horloge est égale à un cycle
(1/F).

Chapitre IV – Le Processeur

Rôle, calcul du CPI moyen, CISC et RISC

IV – 1 Rôle du processeur
Le rôle du processeur est d’exécuter la séquence suivante :

Tant qu’il y a des instructions à exécuter


Faire
Recherche (fetch) - Décodage – Exécuter.
Positionner les flags du mot d’état programme (PSW) ou Registre Codes
Conditions concernés par l’instruction.
Mettre à jour le Compteur ordinal
Fin Faire
Donner la main au Système d’Exploitation

Remarque :
La mise à jour du Compteur Ordinal signifie : incrémentation + 1 du Compteur Ordinal
si l’instruction tient sur un mot mémoire ou bien charger le Compteur Ordinal d’une adresse de
rupture de séquence (branchement inconditionnel, branchement conditionnel, appel de fonction, ….).

IV – 2 Calcul du CPI moyen


Nous allons introduire des facteurs fondamentaux pour évaluer la performance d’une machine.
Ces indicateurs de performances ne sont en aucun cas concluants pour toutes les applications. Mais
ils aident les architectes à concevoir de meilleures machines ou à éduquer les programmeurs et les
concepteurs de compilateur à optimiser les codes pour une meilleure efficacité d’exécution par le
hardware.
Fréquence d’horloge et Cycles Par Instruction (Clock rate et CPI = Cycles Per Instruction)
Le processeur est piloté par une horloge de cycle constant  (en nanosecondes). L’inverse du
cycle donne la fréquence d’horloge.
Clock rate = fréquence d’horloge = 1/  (Ghz)
La taille d’un programme est déterminée par son compteur d’instructions Ic (Instruction Count) en
termes de nombres d’instructions machine à exécuter dans le programme.
Différentes instructions machines nécessitent différents cycles d’horloge à l’exécution. Donc CPI
(CPI =Cycles Per Instruction) est un paramètre important pour mesurer le temps d’exécution de
chaque instruction. Pour un ensemble d’instructions donné, on calcule un CPI moyen sur tous types
d’instruction (fréquence d’apparition dans le programme). Une estimation précise du CPI moyen
nécessite l’analyse de la trace du code programme pendant une longue période.

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         54 
 
Facteurs de performance
Soit Ic = le nombre d’instructions dans un programme donné. Le temps CPU pour exécuter un
programme est estimé par le produit de trois facteurs :
T = Ic x CPI x  (eq1.1)
Dans CPI, sont exclus la recherche instruction, le décodage et la recherche des opérandes. Ces trois
facteurs font partie de l’accès à la mémoire.
On définit le cycle mémoire comme le temps d’accomplissement d’une référence mémoire. En
général, le cycle mémoire est k fois le cycle processeur (). La valeur de k dépend de la technologie
de la mémoire et de l’interconnexion processeur-mémoire.
Le CPI d’une instruction type peut être divisé en deux termes correspondant aux cycles processeur et
aux cycles mémoire pour compléter l’exécution d’une instruction. Donc l’équation eq1.1 devient :

T = Ic x (p + m x k) x  (eq1.2)
p = nombre de cycles processeur pour décoder une instruction et l’exécuter.
m = nombre de références nécessaires.
k = est le taux entre le cycle mémoire et le cycle processeur.
Ic = compteur d’instructions machine.
 = temps de cycle processeur.

L’équation (eq1.2) peut être affinée une fois que les composants de CPI (p, m, k) sont affectés de
poids pour l’ensemble du répertoire d’instructions.

IV – 3 Processeurs CISC et RISC

Quelle est la différence entre un processeur CISC et un processeur RISC ?


Réponse : Les processeurs CISC (Complex Instruction Set Computer) utilisent un jeu d'instructions
complexe tandis que les processeurs RISC (Reduced Instruction Set Computer) utilisent un jeu
d'instructions réduit. Les caractéristiques supplémentaires des processeurs CISC et RISC sont
présentées dans le tableau suivant :

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         55 
 
Tableau de comparaison CISC vs RISC
CISC RISC
Longueur d'instruction variable. Longueur d'instruction fixe.
Grand nombre de modes d'adressage. Peu de modes d'adressage.
Prise en charge d'un petit nombre de Prise en charge d'un grand nombre de registres
registres à usage général. à usage général.
Nécessite moins d'instructions pour Nécessite un plus grand nombre d'instructions
représenter un code d'application par rapportpour représenter un code d'application par
à RISC. rapport au CISC, bien que cela soit discutable.
Nécessite un compilateur complexe. Nécessite un compilateur moins complexe.
Comme le code d'application compilé pour Étant donné que le code d'application compilé
l'ensemble d'instructions CISC entraîne pour l'ensemble d'instructions RISC entraîne un
moins d'instructions, nous avons besoin de plus grand nombre d'instructions (par rapport à
moins de mémoire pour stocker les binaires CISC), nous avons besoin de plus de mémoire
d'application dans une machine CISC. pour stocker les binaires d'application dans une
machine RISC.
Un nombre inférieur d'instructions ne Un plus grand nombre d'instructions ne signifie
signifie pas nécessairement qu'une pas nécessairement qu'une application exécutée
application exécutée sur un processeur CISC sur un processeur RISC entraîne des
se traduit par des performances plus élevées performances inférieures à celles exécutées sur
que la même exécution sur un processeur un processeur CISC.
RISC.
En plus de Charger / Stocker, il existe Load / Store (Instructions Atomiques incluses)
d'autres instructions qui permettent sont les seuls qui peuvent accéder à la
d'accéder à la mémoire. mémoire.
Une instruction CISC typique (instruction Une instruction RISC typique (instruction
Intel x 86) : SPARC) :
Syntaxe assembleur Syntaxe assembleur
ADD AL, BL (Al + BL  AL) ADD rs1, rs2, rd rs1 + rs2  rd)

Des exemples de processeurs CISC sont les Des exemples de processeurs RISC sont
processeurs Intel 486, Pentium (toutes UltraSparc de SUN, MIPS32, MIPS64, ARM’S
saveurs), Krypton, Athlon d'AMD, etc. ARM11, PowerPC de Motorola, etc.

TAB. IV-1 : Tableau de comparaison CISC vs RISC

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         56 
 
IV – 4 Structure externe du processeur MIPS R3000
(Microprocessor without Interlocked Pipeline Stages)

L'architecture externe représente ce que doit connaitre un programmeur souhaitant


programmer en assembleur, ou la personne souhaitant écrire un compilateur pour ce processeur :

- Les registres visibles.


- L'adressage de la mémoire.
- Le jeu d'instructions.
- Les mécanismes de traitement des interruptions et exceptions.

Le processeur MIPS R3000 est un processeur 32 bits industriel conçu dans les années 80. Son jeu
d'instructions est de type RISC. Il existe plusieurs réalisations industrielles de cette architecture
(SIEMENS, NEC, LSI LOGIC, SILICON GRAPHICS, etc...).

IV – 5 Structure interne du MIPS R3000

IV – 6 Jeu d’instructions, Formats et programmation du MIPS R3000.

Chapitre V – Instructions spéciales du Processeur MIPS R3000

Année universitaire 2020 – 2021 Promotion 2ème année LMD Informatique Pr. Mustapha LALAM         57 
 

Vous aimerez peut-être aussi