Architecture des Ordinateurs:21/22
Institut Supérieur des
Études
Technologiques de Sousse
Département de
Technologies
de l’Informatique
Licence appliquée en
Informatique
ARCHITECTURE
DES
ORDINATEURS
Niveau :TI1.* (semestre 1)
Enseignante : Mme Amna FEKIH
ISETSO | Enseignante: Mme Amna FEKIH Page 1 sur 9AU : 2023-2024
Architecture des Ordinateurs : 23/24
4 L’Unité Centrale de Traitements Chapitre
4
4.1. Introduction
L’Unité Centrale de Traitement (UCT) ou processeur central (Central Processing
Unit=CPU) est l’élément moteur de l’ordinateur qui interprète et exécute les instructions du
programme.
L’unité centrale de traitement se compose de deux unités fonctionnellement séparées : l’unité
arithmétique et logique (UAL) et l’unité de commande ou contrôle (UC).
Figure 1 Communication entre UCT et RAM
Le fonctionnement peut être décrit de la façon suivante : l’UC va chercher en mémoire
centrale une instruction en envoyant une adresse et une commande à la mémoire.
L’instruction, enregistré sous forme binaire à l’adresse donnée, est transférée vers l’UC, où
son décodage permet de déterminer l’opération demandée. Cette information est utilisée pour
générer des signaux nécessaires à l’UAL pour déclencher l’exécution de l’instruction. Les
données à traiter seront aussi cherchées en mémoire par l’UC et transférées directement à
l’UAL.
4.1.1. L’unité de commande
Elle permet de séquencer le déroulement des instructions. Elle
effectue la recherche en mémoire de l'instruction, le décodage de
l’instruction codée sous forme binaire. Enfin elle pilote l’exécution
de l’instruction. Les blocs de l’unité de commande sont:
1. Le compteur de programme (PC : Programme Counter)
appelé aussi Compteur Ordinal (CO) est constitué par un
registre dont le contenu est initialisé avec l'adresse de la
première instruction du programme. Il contient toujours
l’adresse de la prochaine instruction à exécuter.
2. Le registre d'instruction et le décodeur d'instruction :
Chacune des instructions à exécuter est transféré depuis la
mémoire dans le registre instruction puis est décodée par le décodeur d’instruction.
3. Bloc logique de commande (ou séquenceur) : Il organise l'exécution des instructions
au rythme d’une horloge. Il élabore tous les signaux de synchronisation internes ou
ISETSO | Enseignante: Mme Amna FEKIH Page 2 sur 9
Architecture des Ordinateurs : 23/24
externes (bus de commande) du microprocesseur en fonction de l’instruction qu’il a
à exécuter. Il s'agit d'un automate réalisé de façon micro- programmée.
4.1.2. L’unité de traitement
Elle regroupe les circuits qui assurent les traitements nécessaires à l'exécution des instructions
Les blocs de l’unité de traitement sont :
1. Les accumulateurs sont des registres de travail qui
servent à stocker une opérande au début d'une opération
arithmétique et le résultat à la fin de l'opération.
2. L’Unité Arithmétique et Logique (UAL) est un circuit
complexe qui assure les fonctions logiques (ET, OU,
Comparaison, Décalage, etc…) ou arithmétique
(Addition, soustraction…).
3. Le registre d'état est généralement composé de 8 bits
à considérer individuellement. Chacun de ces bits est un
indicateur dont l'état dépend du résultat de la dernière opération
effectuée par l’UAL. On les appelle indicateur d’état ou flag ou
drapeaux. Dans un programme le résultat du test de leur état
conditionne souvent le déroulement de la suite du programme. On
peut citer par exemple les indicateurs de :
✓ Retenue (carry : C)
✓ Débordement (overflow : OV ou V)
✓ Zéro (Z)
✓ ...
4.1.3. Architecture interne d’un processeur
4.2. Fonctionnement basique d’une opération du calcul
Toute opération du calcul suit la démarche suivante :
(1) Charger une instruction depuis la mémoire
(2) Charger les opérandes depuis la mémoire
(3) Effectuer les calculs
(4) Stocker le résultat en mémoire
ISETSO | Enseignante: Mme Amna FEKIH Page 3 sur 9
Architecture des Ordinateurs : 23/24
4.2.1. Architecture Von Neuman
Un seul chemin d'accès à la mémoire
✓ Un bus de données (programme et données),
✓ Un bus d’adresse (programme et données)
Architecture des processeurs d’usage général.
(-) Goulot d'étranglement pour l'accès à la mémoire.
4.2.2. Architecture Harvard
Séparation des mémoires programme et données
✓ Un bus de données programme,
✓ Un bus de données pour les données,
✓ Un bus d’adresse programme,
✓ Un bus d’adresse pour les données.
(+) Meilleure utilisation du CPU : Chargement du programme et des données en parallèle
4.3. Cycle d’exécution (Traitement) d’une instruction
Organisation d’une instruction :
Le microprocesseur ne comprend qu’un certain nombre d’instructions qui sont codées en
binaire. Une instruction est composée de deux éléments :
✓ Le code opération : C’est un code binaire qui correspond à l’action à effectuer par
le processeur
✓ Le champ opérande : Donnée ou bien adresse de la donnée.
La taille d'une instruction peut varier, elle est généralement de quelques octets (1 à 8), elle
dépend également de l'architecture du processeur.
Exemple d’ instruction :
ISETSO | Enseignante: Mme Amna FEKIH Page 4 sur 9
Architecture des Ordinateurs : 23/24
Le traitement d’une instruction :
Phase 1 : Recherche de l’instruction en mémoire
✓ La valeur du CO est placée sur le bus d'adresse par l'unité de commande qui émet
un ordre de lecture.
✓ Après le temps d'accès à la mémoire, le contenu de la case mémoire sélectionnée
est disponible sur le bus des données.
✓ L'instruction est stockée dans le registre d’instruction du processeur.
Phase 2 : Décodage et recherche de l’opérande
✓ L'unité de commande transforme l'instruction en une suite de commandes
élémentaires nécessaires au traitement de l'instruction.
✓ Si l'instruction nécessite une donnée en provenance de la mémoire, l'unité de
commande récupère sa valeur sur le bus de données.
✓ L’opérande est stocké dans le registre de données.
Phase 3 : Exécution de l’instruction
✓ Le séquenceur réalise l'instruction.
✓ Les drapeaux sont positionnés (registre d'état).
✓ L'unité de commande positionne le CO pour l'instruction suivante.
Actuellement l’architecture des microprocesseurs se composent de deux grandes familles :
l’ architecture CISC (Complex Instruction Set Computer) et l’architecture RISC (Reduced
Instruction Set Computer)
4.4. Améliorations de l’architecture de base
L'ensemble des améliorations des microprocesseurs visent à diminuer le temps d'exécution
du programme.
La première idée qui vient à l’esprit est d’augmenter tout simplement la fréquence de
l’horloge du microprocesseur. Mais l’accélération des fréquences provoque un surcroît de
consommation ce qui entraîne une élévation de température. On est alors amené à équiper les
processeurs de systèmes de refroidissement ou à diminuer la tension d’alimentation.
Une autre possibilité d’augmenter la puissance de traitement d’un microprocesseur est de
diminuer le nombre moyen de cycles d’horloge nécessaire à l’exécution d’une instruction.
Dans le cas d’une programmation en langage de haut niveau, cette amélioration peut se faire
ISETSO | Enseignante: Mme Amna FEKIH Page 5 sur 9
Architecture des Ordinateurs : 23/24
en optimisant le compilateur. Il faut qu’il soit capable de sélectionner les séquences
d’instructions minimisant le nombre moyen de cycles par instructions. Une autre solution
est d’utiliser une architecture de microprocesseur qui réduise le nombre de cycles par
instruction.
4.4.1. Architecture Pipeline
Principe :
L’exécution d’une instruction est décomposée en une succession d’étapes et chaque étape
correspond à l’utilisation d’une des fonctions du microprocesseur. Lorsqu’une instruction se
trouve dans l’une des étapes, les composants associés aux autres étapes ne sont pas utilisés.
Le fonctionnement d’un microprocesseur simple n’est donc pas efficace.
L’architecture pipeline permet d’améliorer l’efficacité du microprocesseur. En effet,
lorsque la première étape de l’exécution d’une instruction est achevée, l’instruction entre dans
la seconde étape de son exécution et la première phase de l’exécution de l’instruction suivante
débute. Il peut donc y avoir une instruction en cours d’exécution dans chacune des étapes et
chacun des composants du microprocesseur peut être utilisé à chaque cycle d’horloge.
L’efficacité est maximale.
=>Le temps d’exécution d’une instruction n’est pas réduit mais le débit d’exécution des
instructions est considérablement augmenté. Une machine pipeline se caractérise par le
nombre d’étapes utilisées pour l’exécution d’une instruction, on appelle aussi ce nombre
d’étapes le nombre d’étages du pipeline.
ISETSO | Enseignante: Mme Amna FEKIH Page 6 sur 9
Architecture des Ordinateurs : 23/24
Etages d’une pipeline :
▪ P (Prefecth) - Generate program address = Incrémentation du compteur ordinal
▪ F (Fetch) - Get Opcode = Lecture du code de l’instruction en mémoire
▪ D (Decode) - Decode instruction = Décodage de l’instruction
▪ A (Access) - Generate read address = Calcul des adresses des opérandes = Calcul
de l’adresse du résultat
▪ R (Read) - Read operands = Lecture des opérandes en mémoire
▪ X ( Execute) = Exécution de l’instruction = Ecriture du résultat à l’adresse calculée
☺Moins de cycles par instruction
☺Consommation réduite
Aléas d’une pipeline (Problèmes) :
La présence d'un pipeline est donc le partage de l'exécution d'une instruction en plusieurs
étages. La mise en place d’un pipeline pose plusieurs problèmes. En fait, plus le pipeline est
long, plus le nombre de cas où il n’est pas possible d’atteindre la performance maximale est
élevé. Il existe 3 principaux cas où la performance d’un processeur pipeliné peut être dégradé
; ces cas de dégradations de performances sont appelés des aléas :
Aléas de structure : L'implémentation empêche une certaine combinaison d'opérations
(lorsque des ressources matérielles sont accédées par plusieurs étages).
Aléas de données : Le résultat d'une opération dépend de celui d'une opération précédente
qui n'est pas encore terminée.
Aléas de contrôle : L'exécution d'un saut conditionnel ne permet pas de savoir quele
instruction il faut charger dans le pipeline puisque deux choix sont possibles.
ISETSO | Enseignante: Mme Amna FEKIH Page 7 sur 9
Architecture des Ordinateurs : 23/24
4.4.2. Mémoire cache
Le principe de cache est très simple : le microprocesseur n’a pas conscience de sa présence
et lui envoie toutes ses requêtes comme s’il agissait de la mémoire principale :
✓ Soit la donnée ou l’instruction requise est présente dans le cache et elle est alors
envoyée directement au microprocesseur. On parle de succès de cache. (a)
✓ Soit la donnée ou l’instruction n’est pas dans le cache, et le contrôleur de cache envoie
alors une requête à la mémoire principale. Une fois l’information récupérée, il la
renvoie au microprocesseur tout en la stockant dans le cache. On parle de défaut de
cache. (b)
Bien entendu, le cache mémoire n’apporte un gain de performance que dans le premier cas.
Sa performance est donc entièrement liée à son taux de succès. Il est courant de rencontrer
des taux de succès moyen de l’ordre de 80 à 90%.
4.4.3. Architecture Superscalaire
Une autre façon de gagner en performance est d’exécuter plusieurs instructions en même
temps. L'approche superscalaire consiste à doter le microprocesseur de plusieurs unités de
traitement travaillant en parallèle. Les instructions sont alors réparties entre les différentes
unités d'exécution. Il faut donc pouvoir soutenir un flot important d’instructions et pour cela
disposer d’un cache performant.
ISETSO | Enseignante: Mme Amna FEKIH Page 8 sur 9
Architecture des Ordinateurs : 23/24
Remarque :
C'est le type d'architecture mise en œuvre dans les premiers Pentium d'Intel apparus en 1993.
4.4.4. Architecture pipeline et Superscalaire
Le principe est de d’exécuter les instructions de façon pipelinée dans chacune des unités de
traitement travaillant en parallèle.
4.5. Programmation assembleur
4.5.1. Présentation du modèle 8086
Un registre est un contenant dans lequel on peut placer des motifs de bits de 8, 16 ou 32 bits.
On peut appeler un registre par son nom et effectuer des opérations en utilisant les instructions
machine. Par exemple, add eax, 4 additionne 4 au contenu du registre eax et place le résultat
dans eax.
Dans ce processeur, un motif de 8 bits s'appelle un octet (byte), un motif de 16 bits s'appelle
un mot et un motif de 32 bits, un double mot.
Le 8086 possède huit registres généraux. quatre registres de données A, B, C et D, et quatre
registres de pointeurs (adresses), ESI, EDI, EBP et ESP. Pour désigner le registre A au complet
(32 bits), on utilise le nom EAX. Pour désigner les 16 bits de poids faible, on utilise AX. Pour
désigner les 8 bits de poids faible, on utilise AL. On utilise AH pour désigner les bits 8 à 15
du registre A. Il en va de même pour les trois autres registres de données, B, C et D.
ISETSO | Enseignante: Mme Amna FEKIH Page 9 sur 9
Architecture des Ordinateurs : 23/24
De la même façon, le registre ESI désigne le registre de 32 bits, tandis que SI désigne les 16
bits de poids faible de ESI.
Certains registres généraux jouent un rôle spécial. Le registre C sert souvent de compteur, par
exemple dans l'instruction loop. Le registre D sert d'extension au registre A pour enregistrer
des nombres de double précision pour la multiplication et la division. On peut enregistrer un
double mot de 32 bits dans la paire DX:AX ou un quadruple mot de 64 bits dans la paire
EDX:EAX.
Certains registres d'adresse jouent également un rôle spécial à l'occasion. Ainsi, le registre ESI
sert d'adresse source pour les opérations de chaîne, tandis que le registre EDI sert d'adresse
destination. On peut utiliser ESI et EDI comme registres généraux quand on ne les utilise pas
pour des opérations de chaîne.
Les registres d'adresse EBP et ESP ont des fonctions spécialisées. EBP sert de pointeur pour
les blocs de pile (paramètres et variables locales), tandis que ESP est le pointeur de pile
système.
4.5.2. Partitionnement d’un programme
Un programme assembleur est en général séparé en plusieurs parties (appelées segments).
Trois segments sont considérés comme standard en assembleur X86 : .data, .bss et .text.
✓ Le segment .data contient les définitions des variables initialisées à une ou plusieurs
valeurs spécifiées (instructions db, dw, dd...).
✓ Le segment .bss contient les définitions des variables non-initialisées, c’est à dire
uniquement allouées en mémoire. (instructions resb, resw, resd...).
✓ Le segment .text contient le code exécuté par votre programme.
4.5.3. Points départ et sortie du programme
Le point d’entree de votre programme ne dépend actuellement pas de fichier ASM, mais de
l’éditeur de liens (ou « Linker ») utilisé pour transformer le code compilé en exécutable. Pour
beaucoup de linkers, le point d’entrée par défaut est une fonction _start définie comme un
symbole global : ce symbole sera exporté par le programme pour être utilisable par le système
ISETSO | Enseignante: Mme Amna FEKIH Page 10 sur
9
Architecture des Ordinateurs : 23/24
ou par d’autres fichiers compilés lors de l’édition.
Si une fonction (ou une variable) identifiée par un label est également déclaré comme global
dans le fichier ou elle est définie, cette fonction (ou variable) peut être appelée dans un autre
fichier, à la condition que son label soit également déclaré en externe dans le fichier voulant
l’utiliser.
Le programme suivant présente la structure élémentaire d’un programme ASM, dans laquelle
sont incluses les instructions pour quitter un programme proprement :
4.5.4. Les variables – les constantes
[T/N]ASM considère les types de données suivants :
▪ le Byte ( 1 octet = 8 bits)
▪ le Word ( 2 octet = 16 bits)
▪ le Double word ( 2 word = 4 octets = 32 bits)
▪ le Quad word (4 word = 8 octets = 64 bits)
▪ et le exTended word ( type special sur 80 octets pour les réels)
Les lettres majuscules de cette liste sont utilisées pour définir le type de la variable
déclarée.
Cette lettre est associée à un préfixe pour préciser au système si la variable doit être
initialisée (d pour « define ») ou juste allouée en mémoire (res pour « reserve »).
Exemples :
Lors de la déclaration d’une variable initialisée, l’opérande de droite est la valeur
d’initialisation, c’est à dire le contenu de la variable :
➢ var1 db 123 ; "Define Byte" [var1] = 123, sizeof([var1]) = 8 bits
➢ var2 dw 456 ; "Define Word" [var2] = 456, sizeof([var2]) = 16 bits
➢ var3 dd 789 ; "Define Double" [var3] = 789, sizeof([var3]) = 32 bits
➢ var4 dq 123 ; "Define Quad" [var4] = 123, sizeof([var4]) = 64 bits
➢ var5 dt 1.23 ; "Define exTended word" [var4] = 1.23, sizeof([var5]) = 80 bits
Les instructions de déclarations de variables non-initialisées allouent un tableau dont le
nombre d’éléments est définit par l’opérande de droite :
➢ var1 resb 1024 ; "Reserve 1024 Bytes"
➢ var2 resw 1 ; "Reserve 1 Word"
➢ var3 resd 12 ; "Reserve 12 Double"
➢ var4 resq 24 ; "Reserve 24 Quad"
ISETSO | Enseignante: Mme Amna FEKIH Page 11 sur
9
Architecture des Ordinateurs : 23/24
➢ var5 rest 2; "Reserve 2 exTended word"
Pour définir une constante, on utilise l’instruction equ (pour ”equal”) précédée d’un label et
suivi de la valeur de la constante.
➢ myConstante equ 12345
4.5.5. Les instructions de contrôle de flot
Pour contrôler le flot d’instructions, un label peut être utilisée pour identifier le début d’un
bloc d’instruction: la plupart des instructions de contrôle ont besoin d’un point de repère (un
label ou une adresse) pour se déplacer dans les instructions à l’aide de saut.
Il existe en assembleur 2 type de sauts : le saut inconditionnel jmp et les sauts conditionnels.
Voici un exemple de saut inconditionnel.
unLabel:
; instructions
jmp unLabel ; retourne à la position identifiée par "unLabel"
Les sauts conditionnelles dépendent du résultat de l’instruction cmp val1,val2:
Ces instructions de sauts sont nombreuses mais sont toujours de la forme j « cc» label, où
« cc» est la condition du test et label est la position à laquelle le flot d’instructions doit
reprendre.
Ce saut conditionnel peut être simple :
▪ je : jump if equal
▪ jne : jump if not equal
▪ jz :jump if zero
▪ jnz :jump if not zero
Ce saut conditionnel peut être «non-signé» :
▪ je : jump if val1 is equal to val2 (|val1| = |val2|)
▪ ja : jump if val1 is above val2 (|val1| > |val2|)
▪ jae : jump if val1 is above or equal to val2 (|val1| >= |val2|) *
▪ jb : jump if val1 is below val2 (|val1| < |val2|)
▪ jbe : jump if val1 is below or equal to val2 (|val1| <= |val2|)
Ou «signé»:
▪ jg : jump if val1 is greater than val2 (val1 > val2)
▪ jge : jump if val1 is greater than or equal val2 (val1 >= val2)
▪ jl : jump if val1 is lower than val2 (val1 < val2)
▪ jle : jump if val1 is lower than or equal val2 (val1 <= val2)
ISETSO | Enseignante: Mme Amna FEKIH Page 12 sur
9