COURS D`ARCHITECTURE DES ORDINATEURS

publicité
COURS D’ARCHITECTURE DES ORDINATEURS
Chapitre 3 : C.P.U et jeux d’instructions
C.P.U : Central, Processor, Unit.
Objectifs :
-Architecture d’un microprocesseur.
-Exemple simple de processeur 8bits.
-Carte Unité Centrale.
-Modèle de programmation d’un processeur.( =notice )
-Registres.
-Jeux d’instructions (=liste des instructions).
-Langage assembleur(=langage de programmation).
-I) Architecture d’un microprocesseur :
-Exemple : Zilog Z80 :
-Registres :
Les rectangles correspondent à des bouts de registres.
Les données sont en mémoire centrale.
Le registre d’instruction est le lieu où on donne au CPU le code de l’instruction à exécuter.
Il ne peut faire qu’une seule instruction à la fois , il ne peut donc pas faire de parallélisme .
Dans ce processeur il y a une dizaine de registre de données.
-UAL :
Les 2 figures en V sont des UAL . A un instant donné le processeur est capable de
faire 2 types d’opérations(sur les données et sur les adressages).
C’est au niveau de la programmation que l’on défini l’adresse de l’information .
-Le BUS :
Le BUS est les lignes de différentes couleurs. Un BUS de largeur 8bits travaille avec
des mots de 8 bits . Un BUS de largeur 8 bits à un adressage de 256 octets : trop peu pour être
efficace. Un BUS de 16 bits à un adressage de 64Ko.
-Registre A :
(Registre A’=copie ) . Le registre A est un registre spécialisé , c’est un Accumulateur.
Le résultat est forcément dans A, les registres B et C vont dans A.
Un programme est une suite contiguë d’adresses. Il faut savoir l’adresse de la 1ère
instruction. La suite des instructions se trouvent dans le registre P.C dans le CPU.
Le CPU passe par plusieurs étapes : la première étape est la recherche de l’instruction (ou
fetch). Le décodage de l’instruction peut éventuellement amener à lire d’autres données dans
la RAM. Le CPU doit ranger le résultat soit en registre soit en RAM.
Lorsqu’il a fini l’instruction, il passe à l’instruction suivante grâce au registre PC du CPU.
Il faut qu’à la fin de l’instruction en cours, le registre PC du CPU doit pointer sur l’instruction
suivante à exécuter.
Les registres A,B,C,D sont des registres dans lequel on peut travailler sur des données.
L’UAL de gauche est utilisé pour le travail des adresses sur 16 bits d’où des registres de 8 bits
assemblés deux à deux pour faire du 16 bits.
-Motorola 6800 :
La structure un peu différente du Z80 car il n’y a qu’un UAL.
-Intel 8086 :
Base des Intel Pentium. Processeur 16 bits avec un registre AX (qui signifie A
expansion) qui contient AH( pour A haut ) et AL(pour A bas). Cette structure 2*8 bits permet
la compatibilité ascendante avec le 8086 et le Z 80.
Il y a une unité importante : le registre d’instruction transformé en une pile qui permet
d’anticiper en emmenant les instructions au CPU ; c’est l’introduction de la mémoire cache .
On peut avoir en attente jusqu’à 6 instructions.
-Carte Unité Centrale (=Carte mère)
-Partie moteur :
Le CPU est le moteur de la carte , il est rythmé par une horloge ( dispositif qui génère le
signal périodique) qui utilise un quartz pour assurer la périodicité.
-bus d’adresses, de données, de commande.
-Mémoire : ROM et RAM :
La ROM est la mémoire morte, gravée une fois pour toute. Le programme de démarrage se
trouve dans la ROM. Elle sert à initialiser les entrées-sorties , à tester la RAM et à chercher le
système d’exploitation.
-Contrôleurs entrées-sorties :
3 composant de base : -UART ( Universal Asynchronous Receiver Transmitter )
-PIO (parallel input/output )
-PIC (programmable interrupt controller )
les contrôleurs sont reliés au CPU et aux périphériques.
Ils ont 2 fonctions principales :
-Interfaces entre CPU et périphériques :
Les périphériques travaillent autour de la milli-seconde tandis que le CPU travaille au
minimum autour de la micro-seconde . Donc il y a un problème, il faut donc qu’il y ait de la
mémoire dans ces contrôleurs , cette mémoire s’appelle les registres.
-Transcodage :
Le codage du périphérique n’est pas forcément le même que celui du CPU. Il faut
donc les transcoder ou décoder.
-PIO :
Le PIO est l’interface parallèle le plus simple, les données doivent aller le plus vite
possible d’où une transmission parallèle, donc il existe une limite : la distance entre les deux
éléments. (Ex : Ordi-Imprimante : câble de quelques mètres)
Le contraire de la transmission parallèle est la transmission série , il n’y a plus qu’un
seul fils mais la vitesse est fortement diminuée.
-PIC :
Le PIC signale un événement caractérisé par l’instant où il arrive ( par l’occurrence
dans le temps.).
Ex : Badge : 2 mouvements : le badge est détecté alors le lecteur le lit.
Le PIC donne au CPU le signal pour écrire ou pour lire, d’où le terme d’interrupteur.
-Driver :
Régénère les informations sur le BUS.
-II) Modèle de programmation d’un processeur :
-Introduction au langage de programmation :
-Modèle logique d’un processeur
-Quel sont ces registres ?
-Structure et organisation de la mémoire
-Jeu d’instructions.
Organisation de la mémoire :
Ex : L.D A,(47B8) donne l’instruction au CPU de mettre dans le registre A ce qu’il y a dans
le registre 47B8.
Quand on a des registres de 16 bits , le CPU choisit le PF : soit 47B8 soit 47B9.
Les CPU ne sont donc pas tout à fait compatible (Ex : Intel choisira 47B8 mais Motorola
choisira 47B9)
-Registres :
-Mémoires internes et temporaires :
*Manipulation des données
*Manipulation des adresses
Registre index ( dans le Z80 IX et IY)
Registre pile
-Registres spécialisés ( Z80 et 8086 )
-Registres généraux
-Programmation en langage assembleur
-Registres 68000 :
16 registres de 32 bits : 8 orientés donnée ( calcul de donnée) D0 à D7 et 8 orientés
adresses (calcul d’adresses) A0 à A7 mais A7 est le pointeur de pile.
-Pile : (file d’attente)
Différentes techniques de gestion d’une pile dont LIFO (Dernier arrivé, premier sorti)
et FIFO ( Premier arrivé, premier sorti)
Une pile n’est pas un accumulateur.
Une pile est une zone de mémoire avec un accès différent de l’accès à la mémoire. Il faut une
adresse de départ, les piles ont des tailles variables. On doit connaître l’adresse du somment
de la pile, cette adresse de sortie doit être stockée dans un registre : le Stack Pointer.
Notation polonaise inverse ( illustration d’à coté)
-Instructions :
-Composition :
2 parties :
-début : code opératoire, type de l’opération à faire (Ex : L.D A,(47B8) L.D
est le type d’opération .)
-opérandes : (Dans l’exemple, A et 47B8) où effectuer l’opération, avec quels
registres ? 2 natures d’opérandes : donnée, adresse ou les deux.
-Exécution :
-Phase fetch : où se trouve les données ou les adresses à opérer.
-Décodage de l’information.
-Lecture en mémoire : (vers un registre interne) d’une donnée ( ou d’une
adresse qui permet de lire une donnée) c’est la phase de lecture des opérandes.
-Exécution de l’opération (ou éventuelle écriture en mémoire)
-Positionner P.C sur l’instruction suivante. Ex : à l’adresse 1000 il y a
l’instruction L.D ‘A’ , le CPU incrémente alors de 1 et passe à l’instruction pointer par le
P.C : l’adresse 1001 , le P.C pointe alors l’instruction suivante.
-Programme :
3 zones : - zone où se trouve les instructions ( en ROM ou en RAM)
- zone où se trouve les données (en RAM)
- zone de pile
Il faut indiquer à la machine où débute le programme et où il se termine.
-Jeu d’instructions Z80 :
Il y a différents types d’instructions : - chargement ( mémoire vers registre et l’inverse)
- UAL (addition , incrémentation)
- Branchement ( tant que , si alors sinon)
- Appel de procédure
-
Entrées-sorties
Inclassable, divers
-Jeu d’instructions 68000 :
Même niveau de performance que le Z80 , il y a moins d’instructions, dans le 68000 il n’y a
pas d’instructions d’entrées-sorties , elles sont simplifiées.
-Langage assembleur :
-Codage direct d’un CPU (en binaire) mais inconvénient : fastidieux, risque d’erreurs,
peu d’abstraction, jeu d’instruction unique par processeur.
-Langage assembleur :
Langage de premier niveau, meilleure abstraction, demande un programme de
traduction et il y a autant de langages que de processeurs.
-Exemple : du C vers ASM 68K
(Diapo)
static = force à chercher une adresse.
En C
En Assembleur (ASM 68K)
Int a,b,c
A=2
.l
.w
.b
#
_a
_a
_b
_c
dcb.l
move.l #2,_a
long
32 bits pour les entiers
standard 16 bits pour les caractères
court
8 bits
valeur en base dix généralement
nom de la variable
Adresse
3c
40
04
Contenu (en héxadécimale)
0000 0000
1ère variable à l’adresse 3c, contenu à l’adresse 3c,3d,3e3f
0000 0000
2ème variable à l’adresse 40,41,42,43
23fc 0000 0002 0000 0000 003c
23fc correspond à move.l
0000 0002 correspond à 2
0000 003c correspond à _a
Partie centrale : code généré, assimilable par le CPU . C’est un langage machine.
A l’adresse 00 : le programme commence
04 : c’est là où commence l’instruction move #2,_a ( instruction à 10 octets)
Les 2 premiers octets correspondent au code opératoire.
Les 4 octets suivants correspondent à la constante.
Les 4 octets restants correspondent à l’adresse de la variable a.
A l’adresse 04 : 1er octet de l’instruction move.
A l’adresse 05 : 2ème octet de l’instruction move.
A l’adresse 06 : 1er octet de l’adresse du Poids Fort de la constante 2.
Deux configurations possibles soit PF en 06 soit pf en 06.
Bien sur Intel et Motorola ont choisi des configurations différentes.
-instruction c=a+b
L’addition doit se faire dans un registre ( ici dans un registre de donnée ).
1) move.l _a,d0
_a correspond à la source et d0 à la destination ; mais Intel utilise
l’inverse : destination, source.
On a un move et pourtant le code de l’instruction est différent d’avant. (23fc  2039)
Avant on avait une constante vers un bloc mémoire mais maintenant on a une adresse vers un
registre.
Maintenant il n’y a plus d’adresse de la destination, elle se trouve directement dans
l’instruction.
2) add.l _b,d0
le résultat de l’addition se trouve dans le registre d0.
Donc
3) move.l d0,_c
instruction encore différente car ici on a registre vers adresse.
- x = ’0’
move.l #48,_x (on aurait pu avoir ‘0’,_x ou #30,_x).
Le 48 correspond au code ASCII en décimal de 0.
Mais 0000 0048 correspond à l’adresse de x .
clr.b
-y = 0
y ( on aurait pu avoir move.l #0,_y mais c’est plus long a éxecuter)
-De C à ASM Z80 :
Même programme de départ mais pas les mêmes représentations des données :
Entier sur 16 bits et les caractères sur 8 bits.
Dans cet assembleur on peut dire où commence le programme et dire où il fini. (.org h’8000
le programme commence à l’adresse 8000 en hexadécimal ).
-De C à ASM 86 :
-Adressage du 68000 :
-Adressage direct de registre de données. ADD D7,D3
L’incrémentation du P.C est sur 24 bits.
L’adressage interne est sur 32 bits tandis que l’adressage externe est sur 24 bits (soit 16 Mo
adressable).
-Adressage direct de registre d’adresse.
ADD A6,D3
-Adressage immédiat.
L’instruction fournit la valeur à l’opérande.
-Adressage indirect sur registre d’adresse
(A3) on prend ce qui est à l’adresse A3
ADD (A3), D3
-Adressage indirect sur registre avec déplacement.
-Gestion de pile :
Pourquoi a-t-on besoin de gérer une pile dans le CPU ?
La nécessité est apparu quand on a voulu structurer un langage de programmation.
Pour manipuler les procédures il faut un renvoi d’appel de procédure (call pour Intel).
le P.C va alors à l’adresse 5000 puis continue à 5001 jusqu’au Return.
Mais alors où retourner ? Il faut mémoriser l’adresse de retour avant l’instruction Call. Mais il
faut plusieurs lieux de stockage, si on a plusieurs instruction call, il faut une liste d’attente : la
pile. Le CPU a besoin d’avoir un pointeur de pile : le Stack Pointer. Il faut initialiser le Stack
Pointer dans la ROM.
Il y a un problème si on utilise la même procédure d’après plusieurs programmes. Il faut donc
séparer les codes et les données à l’intérieur de la procédure. On doit mettre les données dans
la pile.
Sur le 68000 l’appel de procédure est le JSR.
A7 registre de pile.
-Allocation mémoire en pile. LINK A2,#-256
La pile descend dans la mémoire.
On réserve 256 octets dans la mémoire pour la pile.
-Libération mémoire en pile UNLK A2.
-CONCLUSION :
Il faut un ensemble d’outils pour utiliser un programme :
-Editeur de texte.
Saisie du programme.
-Compilateur.
Traduction d’un programme en langage de haut niveau C,C++ proche de
l’homme en un programme en langage assembleur.
-Assemblage.
Traduction du langage assembleur en langage machine.
-Editions de liens ( Link)
Réutilisation d’autres modules de programmation ( Bibliothèque).
-Exécution et mise au point. (Debug)
-Station de développement
Développement croisé (Ex : Caisse enregistreuse , P.C).
Téléchargement