Vous êtes sur la page 1sur 9

Structure du 68000

Cours de TSII – D.BOURE

1)Introduction:
Ce chapitre a pour objet la découverte des principaux mécanismes du langage-machine. On y découvrira
les caractéristiques du 68000, ses principes de fonctionnement, ses modes d'adressages...
Chacun devra à la suite de ce chapitre savoir analyser et comprendre une instruction 68000 en général.
Les premiers exercices réels pourront être abordés au cours de l'étude du chapitre...

2) Organisation interne du 68000

La figure ci-dessus montre l'organisation interne d'un microprocesseur (MPU Micro-Processing Unit). On
y distingue :
- une ALU (Aritmetic and Logic Unit)
- des registres internes
- une CU (control Unit)
Notre MPU dispose de 3 bus (ensemble cohérent de signaux):
- un bus de données ( 16/32 bits)
- un bus d'adresses ( 23/32 bits)
- un bus de commande

MEO - - Page 1 -
Le bus de données, bidirectionnel, sert à l'échange des informations entre le MicroProcesseur et son
environnement ( mémoire ou périphériques par exemple).
Le bus d'adresse sert à sélectionner l'endroit où se trouve une information qui doit transiter sur le bus des
données.
Le bus de commande transporte les différents signaux d'ordre et de synchronisation requis par le système.

3) Organisation de la Mémoire:
Si un microprocesseur est une formidable machine de calcul, il n'en présente pas moins de regrettables
défauts... Le plus grand d'entre eux étant son incapacité à mémoriser des informations nombreuses.
En effet, seuls les registres permettent à un microprocesseur de garder trace des résultats antérieurs, et
ceux-ci sont bien sûr insuffisants pour un traitement important... Ces registres sont cependant des
mémoires à très grande rapidité, inclus dans le processeur, et leur utilisation sera primordiale...
On va, pour pallier aux insuffisances du microprocesseur, utiliser des RAM externes, fourre-tout dans
lequel nous logerons:
- Nos programmes
- Nos données (Initialisées ou Non)
- Notre Pile
- Et encore bien d'autres sources d'ennuis et de collisions...

Cette division est purement formelle, et ces zones sont tellement identiques que le programmateur peut
très bien modifier un programme comme une zone de données, exécuter une zone de données comme un
programme ...
Sur un micro-ordinateur, on arrivera même à la gestion concurrente de plusieurs applications, avec
chacune une zone programme, une zone de données, une pile propre... Windows ou Unix fournissent des
exemples parfaits de ce qui vient d'être dit...

4) Séquencement d'une Instruction:


Essayons de décrire le fonctionnement du 68000 lors de la rencontre dans la mémoire désignée par le
registre PC (Program Counter) des mots hexadécimaux :

$ 21F9 00FC 0024 2400


Le cycle d'exécution de cette instruction peut se décomposer en :
a) Lecture du code opératoire $21F9:
Ce code est analysé par le décodeur du 68000, pour en déduire quel type d'action il aura à exécuter, les
mots qui suivront ne pourront constituer que des paramètres de l'action. La découverte manuelle de la
signification de $21F9 ne peut se faire que par recherche dans un manuel de référence du 68000.
En binaire:
$21F9 = % 00 10 000 111 111 001
Ce code a été volontairement décomposé en blocs compréhensibles pour en faciliter la lecture:

00 = MOVE
10 = .L
000 111 = L'opérande Destination est une adresse mémoire sur 16 bits...
111 001 = L'opérande Source est une adresse mémoire sur 32 bits...

MEO - - Page 2 -
L'instruction à exécuter est donc entièrement décrite; il s'agit de :

MOVE.L $FC0024,$2400
Le séquenceur du 68000 sait donc désormais ce qu'il doit effectuer.
b)Lecture du mot suivant:
La valeur $00FC est mémorisée dans un registre tampon du bus de données... Aucune autre action n'est
entreprise par le CPU... C'est typiquement ce genre d'action qui ralentit un 68000 face à son grand frère le
68020 par exemple (Gestion 32 bits sur le bus des données) ou face à son concurrent le 80286 (Gestion 16
bits des adresses en mode réel)...
c)Lecture du mot suivant:
Ces 16 bits vont constituer les 16 bits de poids faibles de l'adresse opérande source. L'ensemble formé
avec les 16 bits précédemment lus est immédiatement transmis sur le bus des adresses.
d)Lecture de l'opérande Source:
Ou du moins de la première partie de cette opérande puisque la taille de celui-ci est de 32 bits... La valeur
lue est stockée dans un registre tampon du bus des données... La valeur présente sur le bus des Adresses
est automatiquement incrémentée de 2 unités.
e)Lecture de l'opérande source
Fin de cette lecture, la valeur 32 bits de l'opérande source est maintenant entièrement présente dans un
registre tampon du bus des données...
f)Lecture de la destination
Le séquenceur place à nouveau PC sur le bus des adresses, et provoque la lecture de l'adresse de la
destination. Cette valeur est immédiatement étendue à 32 bits et placée sur le bus des adresses. Notez que
PC est immédiatement incrémenté et pointe dès maintenant sur la prochaine instruction à exécuter.
g)Ecriture sur la destination
Le registre tampon est maintenant déchargé sur le bus des données, et les 16 bits de poids forts sont écrits
en mémoire. Le bus des adresses est incrémenté de 2 immédiatement...
h)Ecriture sur la destination
Les 16 bits de poids forts sont transmis à l'adresse marquée par le bus des adresses. L'instruction en cours
est donc entièrement terminée.

Cette instruction a été effectuée en 8 cycles, 6 cycles de lecture et 2 cycles d'écriture. Dans le cas de cette
instruction, aucun autre travail n'est effectué par le 68000 (contrairement par exemple à une addition ou à
une multiplication)...
Connaissant le temps d'exécution d'un cycle de lecture ou d'écriture, qui est de 4 cycles d'horloge, on peut
prévoir le temps d'exécution exact de l'instruction, soit ici 32 cycles Horloge.

Motorola préconise pour décrire ces temps, la notation : 32(6/2)

MEO - - Page 3 -
5) Structuration des Registres:
Les registres sont des lieux privilégiés pour le stockage des données, et sont partie intégrante du
microprocesseur. Leur accès est donc fort simple et très rapide.
Le transfert d'une donnée de 32 bits d'un registre vers un autre registre peut s'écrire:

MOVE.L D0,D1 et son temps d'exécution est de 4(1/0)


Le seul cycle de lecture est celui du code opératoire lui-même ($2001), l'exécution elle-même est
quasiment instantanée...
Le 68000 possède un grand nombre de registres et permet donc une très grande vitesse, puisque la plupart
des algorithmes peuvent être traités en utilisant les registres uniquement. Cependant tous les registres du
68000 n'ont pas un fonctionnement strictement identique, et il est nécessaire d'en bien connaître les détails
afin d'éviter des erreurs de logique grossières...
D0.D1.D2.D3.D4.D5.D6.D7 - Les Registres de Données :

Les registres de données sont les plus souples que possède le 68000. Ils pourront
32 bits toujours être utilisés comme opérande à une instruction.
L'utilisateur peut à tout moment choisir le format de chacun de ces registres séparément
parmi 8, 16 ou 32 bits. La taille du registre détermine le format d'exécution de
l'instruction. Une addition correcte sur 16 bits peut provoquer un dépassement de
16 bits capacité en 8 bits.

8 bits Le format d'utilisation est précisé, non dans le registre lui-même mais dans le code
opératoire de l'instruction à exécuter. Si une instruction nécessite deux opérandes, il est
évident que le microprocesseur leur attribue la même taille...

Exemples: MOVE.W D0,D1 D0 & D1 sont 16 bits


NOT.L D6 D6 est 32 bits
ADD.B D0,D1 D0 & D1 sont 8 bits

A0.A1.A2.A3.A4.A5.A6 - Les Registres d'Adresses :

Les registres d'adresses A0 à A6 doivent normalement être utilisés comme pointeur sur la
32 bits mémoire ( c'est ce qui explique sur le schéma de la page 1, la liaison directe de ces
Extension registres avec le bus des adresses ). Ils ne contiennent à priori pas de données mais plutôt
à 32 bits les adresses où sont situées les données .

16 bits Rien n'interdit cependant de les utiliser pour y stocker des données ou effectuer des
calculs, à condition de prendre en compte les spécificités des registres d'adresses.

En effet, les registres d'adresses ne supportent que les formats 16 et 32 bits. En format 16
bits, une extension de signe à 32 bits est systématiquement effectuée par le 68000.

Exemples: MOVEA.L #$8000,A0 place $00008000 dans A0


MOVEA.W #$8000,A0 place $FFFF8000 dans A0

MEO - - Page 4 -
Notez l'utilisation de l'instruction MOVEA qui signifie Move To Adress Register. Cependant la plupart
des assembleurs acceptent l'écriture du MOVE standard, remplaçant ce dernier par un MOVEA lors de la
compilation.
De toute façon, il serait préférable d'utiliser ici l'instruction LEA (Load Effective Adress) :

MOVEA.L #$8000,A0 LEA.L $8000,A0

A7 ou USP / SSP - Registre Pointeur de Pile :

Le registre A7 est un registre d'adresse, et il possède toutes les caractéristiques décrites au-dessus. Il peut
être utilisé exactement comme les registres A0 à A6 ...
Cependant ce registre présente la particularité d'être directement utilisé par le 68000, comme pointeur de
pile. Car notre bon 68000 a besoin de stocker de manière dynamique (Oh, que ce mot est ici important)
des informations liées à son fonctionnement, variables locales (parlons pour le moment de zone
temporaire de stockage), adresse de retour de sous-programme, passage de paramètres, interruption (vous
pouvez très momentanément négliger ce dernier point).

Ceci peut être résumé par le schéma suivant:

.....
Paramètre N
Paramètre N-1
......
Paramètre 2
Paramètre 1
Adresse de Retour
Variable Locale 1
Variable Locale 2
.....

Le dernier point (les interruptions), la prémonition de l'avènement du multitâche, une expérience


antérieure (le 6809) ont même poussé Motorola à intégrer 2 piles dans le 68000, USP et SSP qui gardent
toutes deux à un instant donné le nom de A7... C'est USP qui sera implicitement employé dans nos
applications...
La pile système du 68000 est de type FIFO (First In, First Out) par opposition aux piles de type LIFO
(Last In, First Out), et les informations y sont stockées de manière descendante (pour éviter au maximum
les collisions entre DATAs et pile)...
Le registre A7 peut et doit être utilisé par le programmeur, pour fournir des arguments à des fonctions,
réserver des espaces pour des besoins propres... Le maintien de la pile en état incombe bien sûr au
programmeur. On est prié de laisser ces lieux dans l'état... etc...

MEO - - Page 5 -
SR ou CCR - Status Register ou Code Condition Register

SR est le Status Register du 68000 qui décrit un état complet du processeur. Ce registre de 16 bits n'est
accessible en tant normal que par ses 8 bits de poids faible, nommés CCR...
CCR contient les indicateurs suivants:

b0 C Carry flag
b1 V oVerflow flag
b2 Z Zero flag
b3 N Negative flag
b4 X eXtend flag
Ces indicateurs seront, seuls ou en groupe, l'objet de nombreuses instructions conditionnelles...

PC - Program Counter :

PC est le compteur programme . Il s'agit d'un pointeur et sa taille est donc de 32 bits. C'est lui qui gère le
bon déroulement d'un programme, puisque à chaque instruction, PC est déposé sur le bus des adresses, et
pointe toujours sur l'instruction suivante (ainsi un ordre comme le branchement relatif inconditionnel
BRA.S -2 ou $30FE fait rentrer le processeur dans une boucle infinie) ...
Aucune instruction ne fait apparaître le mot PC explicitement, mais de nombreuses instructions influent
implicitement PC... L'instruction JMP $3135 est en fait un MOVE.L #$3135,PC ...

6) Les Modes d'Adressage


Pour manipuler les données et les registres, le 68000 dispose d'un nombre relativement limité
d'instructions, 56 sur le 68000. Mais chacune de ces instructions, à quelques-unes près, peut opérer dans
les trois formats BYTE, WORD et LONG... et manipuler chacun de ces opérandes de 14 manières
différentes (modes d'adressage) portant à bien plus de 1000 le nombre réel d'instructions possibles...
Pour bien programmer en langage-machine, la connaissance des 14 modes d'adressage s'avère encore plus
importante que les 56 mnémoniques de base...

Quelques éclaircissements et exemples ne feront aucun mal ...

Sur une calculatrice (bas de gamme), vous pianotez directement des valeurs au clavier, et vous effectuez
des opérations. Il s'agit de manipulation de constantes ...
Si cette même calculatrice est dotée de mémoires, vous pouvez y stocker, ou y récupérer des valeurs. Il
s'agit bien sur de variables... Les registres peuvent aussi être considérées comme des variables d'un type
privilégié.
Autre exemple, quand en mathématiques, vous écrivez une expression du type X=8 , vous affectez une
valeur constante à une variable. Et si vous décrivez la multiplication de 2 matrices par une formule

∑b
comme:
ai, j = i, k × ck , j
k = 0 ,n

vous aurez besoin de pointer des éléments de matrice par des éléments génériques figurés par le début des
matrices en mémoire...

MEO - - Page 6 -
Les modes d'adressage du 68000 contribuent à la transcription la plus simple possible de ces différents
problèmes...

Les Constantes :
Les constantes ne peuvent bien sûr être utilisées que comme opérande source. Elles sont signalées lors de
l'écriture d'une instruction par le symbole : # . Ce mode est appelé mode immédiat.
Exemples:
MOVE.L #$56789,D0
MOVE.W #256*6,D1
MOVE.B #-1,D2
Cette forme d'adressage exige un temps CPU correspondant à la lecture de l'argument soit 4(1/0) en
BYTE ou WORD, et 8(2/0) en LONG...
Il existe une variante un peu spéciale du mode immédiat. Motorola a en effet constaté que les valeurs les
plus faibles étaient aussi et de loin les plus employées. Il leur a alors semblé qu'il était rentable de prévoir
quelque chose de particulier pour répondre à une instruction comme:
MOVE.L #1,D0 qui utilise 6 octets et nécessite 12(3/0) cycles...
Trois instructions particulières ont alors été mises au point; il s'agit de MOVEQ (0 à 255), ADDQ (1 à 8),
SUBQ (1 à 8) formant le groupe particulier d'instruction utilisant le mode immédiat rapide dans lequel la
valeur opérande est incluse dans le code opératoire donnant au mode d'adressage un temps record de
0(0/0) , l'instruction précédente devenant:
MOVEQ #1,D0 qui utilise 2 octets et nécessite 4(1/0) cycles...

Les Variables Registres :

Déjà utilisées implicitement dans nos exemples précédents, les adressages directs de registres sont
infiniment rapides, 0(0/0) et doivent donc être utilisés au maximum... Ils sont de deux types correspondant
aux deux types de registres: Dn, données et An, Adresses ...
Exemples :
ADD.W #15,D0
MOVEA.L D0,A3
SUB.L D1,D2

Notez la forme MOVEA qui sur-indique que la destination est un registre d'adresse. La plupart des
assembleurs acceptent que l'on oublie le A ...

Les Variables Mémoires :

Comme nous l'avons déjà signalé, les registres sont en nombre insuffisants pour stocker les données dont
a en général besoin un programme, et l'on a alors recours à la RAM pour stocker les données. Lors de
l'assemblage, deux modes d'adressage seront utilisés: le mode absolu court, si l'adresse à laquelle on veut
accéder tient sur 16 bits, et le mode absolu long dans le cas contraire... Les temps pour ce mode
d'adressage sont résumés dans le tableau ci-dessous:
.W .L
absolu court 8(2/0) 12(3/0)
absolu long 12(3/0) 16(3/0)
Le mode absolu court est la plupart du temps utilisé exclusivement par les ROMs Système...
Il est évident que ce mode commence à soulever des problèmes majeurs: comment connaître l'adresse
d'une variable avant d'avoir écrit une application et vice-versa... La seule solution est de laisser

MEO - - Page 7 -
l'assembleur fixer les adresses de nos variables, en n'utilisant nous-mêmes que des noms symboliques, qui
auront par ailleurs l'avantage d'être plus représentatifs de nos variables.
En effet une variable nommée Echelle est à mon avis plus parlante que $120C4 ... Mais chacun reste
libre, bien sûr...

Les Variables Indexées :

Dans les modes indexés, qui constitue le dernier groupe des modes d'adressage, nous allons aborder la
véritable utilisation des registres d'adresses A0-A6, puisque ces registres vont justement servir d'index , de
pointeur sur une variable en mémoire...
Ainsi, par exemple :
MOVE.W D0,MyVariable
est équivalent à
MOVE.L #MyVariable,A0 ou mieux LEA MyVariable,A0
MOVE.W D0,(A0)

Cette manipulation qui perd ici tout intérêt, va prendre tout son intérêt si je suppose que MyVariable,
constitue non une simple variable de type WORD, mais une suite de 10000 entiers de type WORD qui
sont initialisés avec le registre D0 ...
Vous écririez alors :
MOVE.W D0,MyVariable
MOVE.W D0,MyVariable+2 ;Trop heureux que les assembleurs acceptent.
........... ; soit 10000 lignes à taper
MOVE.W D0,MyVariable+19998

alors que les modes indexés vous permettraient d'écrire:


LEA MyVariable,A0
Loop: MOVE.W D0,(A0)
ADDA.W #2,A0
CMP.L A0,MyVariable+20000
BLE Loop

ou en progressant encore de quelques pas de géants dans la programmation


LEA MyVariable,A0
MOVE.W #9999,D1
Loop: MOVE.W D0,(A0)+
DBF D1,Loop

L'amélioration de ce dernier exemple nous montre que les modes indexés possèdent même d'intéressantes
variantes. Parlons avant d'aborder ces variantes des performances de ce mode, pour lequel la description
de l'adresse de l'opérande est fournie dans le code opératoire, ne rendant donc impératif que la lecture (ou
l'écriture) de l'opérande lui-même, soit des temps de 8(2/0) en LONG et 4(1/0) en WORD soit un gain de
33% ou 50% par rapport à l'adressage Absolu Long ...

MEO - - Page 8 -
Comme vu page précédente, de nombreuses variantes de ce mode existent, ce sont :
Il s'agit du type de base. Bizarrement, ce n'est pas et de loin le plus employé.
(An) Rappelons ses temps d'exécution: 4(1/0) en WORD et 8(2/0) en LONG.

Mode Post-Incrémenté. Le registre d'adresse utilisé comme pointeur est, après


(An)+ exécution de l'instruction en cours, incrémenté de 1, 2 ou 4 unités suivant la
longueur de la donnée manipulée par l'instruction. Ce type d'adressage est
particulièrement utile lors de la copie d'un bloc de données d'un endroit vers un autre, avec une instruction
comme MOVE.L (A0)+,(A1)+ . Notez la position du + à l'extérieur des parenthèses pour
bien montrer que c'est le pointeur qui est incrémenté et non son contenu ( en C, on aurait *(p++) et non
*(p)++ )... Les temps d'exécution sont identiques à ceux du mode indexé simple...
Similaire au mode précédent si ce n'est que An est décrémenté avant exécution de
-(An) l'instruction. Ce qui rend ce mode d'adressage exactement symétrique du précédent.
A noter que cette instruction prend 2 temps de cycles d'horloge de plus que le mode
postincrémenté, soit 6(1/0) et 10(2/0) en WORD et LONG ...
Mode Indexé avec Déplacement Constant... L'adresse de l'opérande est obtenue par
$xxxx(An) addition du déplacement sur 16 bits et du registre d'adresse utilisé comme pointeur.
Cette formulation réclame des temps de 8(2/0) en WORD et de 12(3/0) en LONG.
Cette forme est particulièrement bien adaptée pour aller rechercher des informations dans un champ
particulier d'une structure. (Ceux qui ne demandent aucune explication sur cette dernière phrase sont, soit
trop intelligents, soit trop fainéants).
Le Nec Plus Ultra en manière de mode d'adressage, ce mode dit Indexé avec
$xx(An,Rn) Déplacement Registre et Offset exige des temps d'exécution de 10(2/0) en WORD et
de 14(3/0) en LONG. L'élément noté Rn est un registre quelconque, c'est-à-dire
Registre d'Adresses ou Registre de Données. En ce dernier cas, (et c'est une exception sur le 68000) il
faudra préciser dans l'opérande, si le registre de données est à prendre en WORD ou en LONG.
Ce mode n'est jamais autorisé pour décrire un opérande destination...
Exemple:
MOVE.B 6(A1,D4.W),D0
MOVE.B #12,0(A0,D0.L)

Mode d'adressage Relatif au compteur programme. Très peu utilisé sur des micro-
$xxxx(PC) ordinateurs évolués, il présente, sur des cartes de développement, l' intérêt d'être
indépendant de l'endroit où sera chargé un programme. Les débutants ont cependant
tout intérêt à se méfier de ce mode et de son confrère ci-dessous. Temps d'exécution identiques à ceux du
mode absolu court : 8(2/0) et 12(3/0) .
Dernier mode d'adressage du 68000, ce mode est symétrique du mode $xx(An,Rn)
$xx(PC,Rn) avec le Compteur Programme. Son utilisation est très malaisée.

Il existe d'autres modes d'adressage très spécifiques, pour certaines instructions relatives par exemple à
SR ou CCR ou encore USP.
De même, certaines instructions suppriment un degré d'indirection aux modes d'adressages. Il s'agit des
instructions comme LEA, BRA, JMP, BSR, JSR, Bcc, DBcc...

Ce qui est ou non autorisé, en tant que mode d'adressage est un problème complexe, avec peu de règles, et
beaucoup de savoir-faire, rendu encore plus complexe par les variantes d'une même instruction. Ainsi
ADD possède les formes : ADD, ADDA, ADDI, ADDQ, ADDX... Simple . Non???

MEO - - Page 9 -