Filtration sur disque rotatif | Decapage par projection d'abrasifs
Electronique numerique | Mecanique des fluides | Resistance des materiaux | Calculs numeriques
Tutoriaux ANSYS | Tutoriaux CATIA

Électronique numérique

4. Assembleur 68000

Ce paragraphe s'attache à faire d'abord un bref rappel de l' architecture du 68000 avant d'aborder l' essentiel, c'est-à-dire le mode d'adressage, le jeu d'instruction, la pile, les sous-programmes et les interruptions. Pour plus de détails vous trouverez ici quelques liens appropriés.

 

4.1. Description du microprocesseur 68000

Le 68000 est microprocesseur 64 broches qui a été développe par Motorola en1979, plus performant et plus complexe que certains de ses prédécesseurs (6502, 6800). Il possède huit registres d'adresse de 32 bits (A0-A7), huit registres de données (D0-D7), un registre d'état (SR) de 16 bits et un registre compteur programme (PC) de 32 bits. Le registre d'adresse A7 joue le rôle de pointeur de pile (SP).

 

Le 68000 possède un bus d'adresse unidirectionnel de 23 bits et un bus de données bidirectionnel de 16 bits. Il peut donc adresser une zone mémoire de 223  soit 8 Mmots de 16 bits (16 Mo). Il peut fonctionner sous deux modes: mode superviseur et mode utilisateur. Le pointeur de pile A7 est différent selon le mode de fonctionnement (SSP: pointeur de pile superviseur, USP: pointeur de pile utilisateur).

Son jeu d'instruction et son mode d'adressage lui permettent de manipuler de manière assez simple des structures de données complexes (tableaux multidimensionnels, ...). Il peut en outre s'interfacer avec divers périphériques  de manière asynchrone, au travers d'interruptions avec niveaux de priorité.

 

Gestion de la mémoire:

La manière dont le 68000 gère la zone de mémoire qui lui est associée est très particulière. En effet ses registres d'adresse possédant 32 bits, cela veut dire qu'une adresse logique est codée au maximum sur 32 bits (a0-a31). Or il se trouve que physiquement son bus d'adresse lui permettant d'accéder à une adresse mémoire, possède 23 bits (a1-a23), ce qui veut dire que les bits a24-a31 de tous les registre d'adresse ne sont pas transmis pour permettre le décodage d'adresses mémoire.

Le plus embêtant est que le bit a0 ne ressort pas du boîtier, cependant sa valeur binaire indiquant si l'adresse est paire (a0=0) ou impaire (a0=1) reste très utile pour savoir l'adresse de la mémoire à accéder (décodage d'adresse).

Le 68000 gère de ce fait la mémoire octet par octet, au travers du bit a0 (interne) et des lignes de contrôle UDS (Upper Data Strobe) pour la lecture ou l'écriture de l'octet de poids fort et LDS (Low Data Strobe) pour l'octet de poids faible (voir tableau).

 

/UDS /LDS a0 Taille (bits) Observations
0 0 0 16 1 opération de lecture ou écriture
0 0 1 16 impossible
0 0 0 32 2 opérations de lecture ou écriture
0 0 1 32 impossible
0 1 0 8 lecture ou écriture octet poids fort
1 0 1 8 lecture ou écriture octet poids faible

 

 

4.2. Modes d'adressage

La manière dont les adresses mémoire, les registres d'adresse et de données peuvent être spécifiées dans les différentes instructions du 68000 constitue son mode d'adressage. Le microprocesseur 68000 possède 14 modes d'adressage parmi lesquels l'adressage direct et indirect par registres, l'adressage immédiat, absolu, l'adressage relatif au compteur programme. Nous allons les présenter au travers de l'instruction MOVE qui est très fréquemment utilisée suivant la syntaxe suivante:

MOVE.taille <source>,<destination> avec taille pouvant être B (Byte, octet ou 8 bits), W (Word, mot court de 16 bits) et L (Longword, mot long de 32 bits)

 

Ex: MOVE.W <source>,<destination>

 

Adressage direct ou indirect par registre

Dans ce mode d'adressage la donnée à manipuler est stockée dans un registre (adresse ou données).

 

Direct par registre

Exemple:

MOVE.W A2, D1

Avant:

D1=$FFFFFFFF, A2=$003E54B7

Après:

D1=$FFFF54B7

seuls les 16 bits de poids faible du mot contenu dans le registre A2 sont copies dans le registre de donnée D1.

 

Indirect par registre

Exemple:

MOVE.L (A2), D1

Avant:

D1=$FFFFFFFF, A2=$003E54B7

$003E54B7=$012C5D3F

Après:

D1=$012C5D3F

Le registre A2 contient une adresse mémoire. les 32 bits de la valeur pointée par le registre A2 sont copiés dans le registre D1.

Note: la parenthèse indique une indirection qui ne peut se faire que sur un registre d'adresse.

 

Adressage indirect avec post-incrémentation

 

Ce mode d'adressage convient tout particulièrement au traitement de tableaux. A partir de l'adresse de base contenue dans un registre d'adresse et de la taille du tableau , on peut accéder aux données consécutives de ce tableau en incrémentant cette adresse. Le contenu du registre qui sert à l'indirection est modifié à chaque incrémentation. La valeur incrément dépend de la taille de la donnée manipulée:

 

 

Indirect avec post-incrémentation

Exemple:

MOVE.L D1, (A3)+

Avant:

D1=$001527A6, A3=$143E54B2, $143E54B2=$FFFFFFFF

Apres:

$143E54B2=$001527A6

A3=$143E54B2+ 4, D1=$001527A6

la valeur (32 bits) contenue dans le registre D1 est copiée dans la zone mémoire pointée par le registre A3. Apres l'opération le contenu de A3 est incrémenté de 4 car il s'agit d'un mot long.

 

Adressage indirect avec pré-décrémentation

A l'image du mode d'adressage indirect avec post-incrémentation, l'adressage indirect avec pré-décrémentation sert à manipuler des structures de données très complexes.  Il permet le balayage d'un tableau par ordre décroissant. Le registre d'adresse servant à l'indirection est modifié. La valeur de décrémentation dépend de taille du mot manipulé:

-adresse décrémentée de -1 pour un octet,

-adresse décrémentée de -2 pour un mot court (16 bits),

-adresse décrémentée de -4 pour un mot long (32 bits).

 

Indirect avec pré-décrémentation

Exemple:

MOVE.W D4, -(A3)

Avant:

D4=$B56E1AD2, A3=$00418FF2, $00418FF0=$FFFFFFFF

Apres:

A3=$00418FF2-2=$00418FF0

$00418FF0=$FFFF1AD2, D4=$B56E1AD2

L'adresse contenue dans le registre A3 est décrémentée avant d'être positionnée sur le bus d'adresse. Puis le contenu dans le registre D4 est  copiée dans la zone mémoire pointée par le registre A3.

 

Note:

Deux autres modes d'adressage indirect similaires aux deux précédents sont utilisés pour manipuler directement  les éléments d'un tableau: l'adressage indirect avec déplacement et l'adressage indirect avec index et déplacement. Les syntaxes utilisant l'instruction MOVE se présentent ainsi:

indirect avec déplacement:

 

MOVE.W d16(An) , Dn avec d16 une valeur sur 16 bits maximum.

 

Exemple: MOVE.B $ 12F4(A0),D2; copie de la valeur point ée par A0+ $ 12F4 dans le registre de donnée D2.

 

indirect avec index et déplacement:

 

MOVE.W d8(An, Xn) , Dn; d8 est une valeur sur 8 bits maximum sign és et l'index Xn est un mot court (16 bits) ou long (32bits) pouvant être contenu dans un registre.

 

Exemple MOVE.B $ C5(A0, D1.W),D2; la valeur point ée par A0+D1+ $ C5 est copi é e dans le registre D2.

Il est à noter que l'adresse effective obtenue (d16+ An ou d8+An+Xn) devra être paire si on travaille sur des mots courts et un multiple de 4 pour les mots longs.

 

Adressage immédiat

L'adressage immédiat est utilisé pour assigner une valeur constante dans un programme. On utilise pour cela le symbole dièse "#". Si ce symbole est omis, ce qui arrive assez souvent, alors on a affaire à un adressage absolu.

 

Immédiat

Exemple:

MOVE.W #$356D, D0

Avant:

D0=$FFFFFFFF

Après:

D0=$FFFF356D

La valeur qui suit immédiatement le symbole # est  copiée directement dans le registre de donnée D0.

 

Note: Il faut faire attention à la taille du mot spécifiée dans l'instruction. En effet MOVE.B # $ 356D, D0 génère une erreur car la valeur 356D a une taille de 16 bits.

 

Adressage absolu

Dans ce mode d'adressage, l'adresse du mot à manipuler est indiquée directement soit dans la source, soit dans la destination. L'adressage est dit court quand l'adresse de la donnée est codée sur 16 bits maximum et long lorsqu'elle est codée sur 32 bits maximum.

 

Absolu court ou long

Exemple1: court

MOVE.L $14FE, D0

 

 

 

Exemple2: long

MOVE.B $5684FD2E, D0

Avant:

D0=$FFFFFFFF, $14FE=$34DFE01E

Après:

D0=$34DFE01E

Avant:

D0=$FFFFFFFF, $5684FD2E=$3FF6584A

Après:

D0=$FFFFFF3F

Le contenu de l'adresse mémoire est copié à chaque fois dans le registre de donnée D0, en tenant compte de la taille du mot.

 

9/11

 

Qui je suis | Plan du site | Me contacter