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...
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...
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.
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:
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...
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.
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) :
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).
.....
Paramètre N
Paramètre N-1
......
Paramètre 2
Paramètre 1
Adresse de Retour
Variable Locale 1
Variable Locale 2
.....
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 ...
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...
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 ...
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...
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
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 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 -