ASSEMBLEUR

 

 
COURS D'ASM 68000
(par le Féroce Lapin)

retour au VOLUME 1


******************************************************************
*                                                                *
*             COURS D'ASSEMBLEUR 68000 SUR ATARI ST              *
*                                                                *
*                 par Le Féroce Lapin (from 44E)                 *
*                                                                *
*                         Cours numéro 4                         *
*                                                                *
******************************************************************

Nous allons aborder maintenant les registres d'adresse. Tout comme
les registres de données, ces registres sont codés sur 32 bits (un
long  mot). Donc à priori aucune différence, puisque le micro-pro-
cesseur  ne connaît que des chiffres, que ceux-ci représentent des
données  ou  des  adresses, peu lui importe.  C'est vrai en grande
partie  et  d'ailleurs  sur  certains  micro-processeurs, il n'y a
qu'un  ou  deux  registres, qui  peuvent  contenir  indifféremment
adresse ou données.

Voyons, grâce  à un exemple, les différences en ce qui concerne le
68000 MOTOROLA.

Tapons  donc  le  programme suivant, après avoir, bien sûr, effacé
l'ancien, et assemblons.

          MOVE.L     #$12345678,D0
          MOVE.B     #$AA,D0
          MOVE.L     #$12345678,A0
          MOVE.B     #$AA,A0 
          MOVE.L     #$12345678,A1
          MOVE.B     A1,D1

L'assembleur  note 2 erreurs et nous les annonce par 'invalid size
at line 4' et la même chose pour 'line 6'. Puisque c'est la taille
et  non  l'opération  elle-même qui semble poser problème, nous en
déduisons  que  le  MOVE vers ou à partir d'un registre d'adresse,
n'est  pas  possible sur un byte. Rectifions donc la ligne 4 et la
ligne 6 en remplaçant les MOVE.B par des MOVE.W et ré-assemblons.

Note: Lorsque  l'assembleur  note une erreur, il donne la ligne où
se  situe  celle-ci. Dans cette numérotation les lignes vides sont
comptées.

Ainsi si vous aviez passé une ligne après MOVE.L #$12345678,D0 les
erreurs auraient été annoncées ligne 5 et 7.

Cela  fait  déjà  une  différence puisque si vous regardez bien le
programme, nous  voulions  réaliser  une  opération  avec  D0:  Le
remplir  au  maximum de sa taille, puis vérifier que le MOVE de la
ligne  2, n'affecterait que le byte de poids faible, puis réaliser
la même opération sur A0.

Impossible  à  priori.  Tant  pis,  suite  à  notre  modification,
l'opération se déroulera donc sur un word au lieu d'un byte.

Débuggons  notre  programme. Première  constatation: l'assembleur,
voyant que les opérations ont lieu avec des registres d'adresse et
non  pas  des  registres de données, a automatiquement modifié les
MOVE  vers  A0 et A1, pour les transformer en MOVEA, ce qui se lit
MOVE ADDRESS

Exécutons  le  programme  pas-à-pas. D0 prend la valeur $12345678,
puis  seul  son byte de poids faible est modifié, D0 prenant alors
la  valeur  $123456AA. Ensuite A0 prend la valeur $12345678. Après
la  ligne  suivante, l'opération  affectant le word, nous devrions
avoir $123400AA. Et bien pas du tout! Nous obtenons $000000AA.

Nous  venons  donc de voir qu'un registre d'adresse est totalement
influencé  (donc  sur un long mot) lorsqu'il est la destination de
l'opération. Qu'en est-il donc lorsqu'il en est la source ?

Continuons  donc  notre programme, avec le remplissage de A1 et de
D1. Nous  constatons par la suite que seul le word de poids faible
de A1 vient écraser celui de D1.

NOTE: $AA  est  bien  en  chiffre  en hexadécimal. Si vous pensiez
qu'il  s'agissait  de simples lettres de l'alphabet, dormez 1 ou 2
jours, et reprenez le cours à la première leçon!

De tout ceci nous déduisons 2 définitions:

REGISTRES DE DONNÉES: Chaque registre de données a une longueur de
32 bits. Les  opérandes  sous forme d'octet occupent les 8 bits de
poids  faible, les  opérandes  sous  forme  de mot, les 16 bits de
poids faible et les opérandes longs, la totalité des 32 bits.

Le  bit de poids le plus faible est adressé comme bit 0, le bit de
poids le plus fort est adressé comme bit 31.

Lorsqu'un  registre  de  données  est  utilisé soit comme opérande
source, soit  comme  opérande  destination, seule la partie appro-
priée  de  poids  faible est changée.  La partie restante de poids
fort n'est ni utilisée, ni modifiée.

REGISTRES D'ADRESSE: Chaque registre a une longueur de 32 bits, et
contient   une  adresse  sur  32  bits.  Les  registres  d'adresse
n'acceptent  pas  une  opérande  dont  la  taille est l'octet. Par
conséquent lorsqu'un registre d'adresse est utilisé comme opérande
source, soit  le mot de poids faible, soit l'opérande long dans sa
totalité est utilisé, en fonction de la taille de l'opération.

Lorsqu'un   registre   d'adresse  est  utilisé  comme  destination
d'opérande  le  registre entier est concerné, indépendamment de la
taille  de  l'opération. Si l'opération porte sur un mot, tous les
autres  opérandes  subissent  une  extension de signe sur 32 bits,
avant que l'opération ne soit effectuée.

Définitions  extraites  du  document réf EF68000 (circuit intégrés
MOS THOMSON EFCIS), 45 avenue de l'Europe 78140 Velizy.

Dans  ces définitions, nous remarquons un nouveau terme: opérande.
C'est  le  terme  qui désigne la valeur utilisée dans l'opération.
Ainsi  dans MOVE.W D0,D1 l'opérande source, c'est le word de poids
faible  de  D0 alors  que l'opérande destination, c'est le word de
poids faible de D1.

Nous savons maintenant ce qu'est le PC, un registre de données, un
registre  d'adresse, nous  avons un peu idée de ce que nous montre
les  fenêtre  de  MONST, continuons donc à décortiquer ce fabuleux
outil !

Pour  observer la fenêtre de MONST, si vous n'avez pas assemblé de
programme, impossible d'utiliser Alternate+D. Il vous sera répondu
qu'il  n'y  a pas de programme en mémoire. Tapez donc Alternate+M,
vous  voyez  MONST  apparaître, mais  vous  demandant quel fichier
charger. Tapez ESC et nous voici tranquille pour une observation.

Nous  voyons bien dans la fenêtre du haut nos registres de données
et à droite nos registres d'adresse. Sous les registres de données
SR  puis  PC. Le  PC  (program counter), nous savons ce que c'est,
mais le SR ?


LE STATUS REGISTER

Le  SR  (prononcer  Status  Register, ce qui veut dire en Français
registre  d'état), est  un  registre codé sur un word (16 bits) et
qui, comme  son  nom  l'indique,  nous  renseigne  sur  l'état  du
micro-processeur.

Il est l'exemple frappant de ce que nous avons vu dans l'introduc-
tion  du  cours 3, à savoir qu'il est bien dangereux de traiter un
ensemble  de  bits  comme  un simple chiffre, plus ou moins grand.
Voyons la décomposition du Status Register.

numéro des bits 15----------------------------------0
appellation       T . S . . . I2 I1 I0 . . . X N Z V C

Tout  d'abord  il  faut savoir que certains bits du SR ne sont pas
utilisés. Ils sont ici symbolisés par un point chacun.

Commençons  par  la  description des bits de droite, en commençant
par le 0.

Le bit C (C signifie Carry donc retenue en Français).
Ce  bit  est mis à 1 lorsqu'il y a une retenue dans le bit le plus
élevé  (donc  de poids le plus fort) de l'opérande objet, dans une
opération arithmétique.

Le bit V (V signifie oVerflow donc dépassement en Français).
Imaginons  une addition de 2 nombres positifs, lorsque le résultat
va  déborder  les  limites  du  registres, on obtiendra en fait un
nombre  négatif  à  complémente à 2. En effet le fait de mettre le
bit  de  poids le plus fort à 1 indique que le nombre est négatif.
Comme ce n'est pas,dans le cas présent,  le résultat recherché, on
est  prévenu  du dépassement par le fait que le bit V est mis à 1.
Il indique également, lors de divisions,  que le quotient est plus
grand qu'un word ou bien que nous avons un dividende trop grand.

Le  bit  Z (Z signifie Zéro). Il n'indique pas que le résultat est
égal  à  0, mais  plutôt que le résultat est passé de l'autre coté
de 0. En  effet, ce  bit est à 1 lorsqu'après une opération le bit
de poids le plus fort du résultat est mis à 1, ce qui signifie que
nous  sommes en présence d'un nombre négatif en complément à 2. Le
bit N  (N  signifie Negate )  signifie que nous sommes en présence
d'un nombre négatif.

Le  bit  X  (X  signifie eXtend donc extension). C'est un bit bien
spécial qui se comporte un peu comme une retenue. Les instructions
qui utilisent ce bit le précisent dans leur nom.  Par exemple ADDX
qui se lit add with extend est une opération d'addition prenant en
compte  ce  bit  X. Ce  bit X est généralement le reflet du bit C,
mais, contrairement, à  celui-ci, certaines instructions ne le mo-
difient pas.

Lorsque nous étudierons de plus prés les instructions du 68000, le
fait  que l'instruction affecte ou non tel ou tel bit sera parfois
très important.

Le bit T (T signifie Trace donc suivre en Français).
Lorsque ce bit est à 1, le 68000 se trouve en mode Trace.

Alors  là, soyez  bien  attentif, ce  qui va suivre est primordial
pour la suite des cours!!!

Le mode Trace est un mode de mise au point pour les programmes. Et
oui, c'est carrément DANS le microprocesseur qu'une telle commande
est  insérée. A  chaque fois que le 68000 exécute une instruction,
il va voir dans quel état se trouve le bit T. S'il trouve ce bit à
0, il  passe à la prochaine instruction. Par contre, si ce bit est
à  1, le  68000  laisse  de  côté  (temporairement)  le  programme
principal  pour  se  détourner vers une routine (un 'bout' de pro-
gramme) qui  affichera par exemple la valeur de tous les registres
(D0 à  D7 et  A0 à  A7). Imaginons  qu'il  faille  appuyer sur une
touche pour sortir de cette routine: Nous avons donc tout le temps
de  consulter  ces  valeurs. Nous  appuyons sur une touche: fin de
notre  routine, le  68000 retourne  donc  au  programme principal,
exécute  l'instruction  suivante, teste le bit T, le trouve à nou-
veau  à  1, se  branche  donc sur notre routine, etc... Nous avons
donc  un  mode  pas-à-pas. Or, vous avez déjà utilisé cette parti-
cularité  en  visualisant  le  déroulement  des  instructions avec
MONST!

Tapez le programme suivant:
          MOVE.W     #$23,D0
          MOVE.W     #$15,D1

Assemblez  et  faites  Alternate+D pour passer sous MONST. Appuyez
une  fois  sur  Control+Z  et observez le Status Register. MONST a
affiché  T, indiquant  ainsi  que ce bit est à 1. Nous sommes donc
bien en mode Trace. Quittez le programme par Control+C.

Nous  arrivons  maintenant  à  nous poser une question: Le 68000 a
trouvé  le bit T à 1. D'accord, il sait où est son Status register
et  il  sait  que  le  bit T c'est le 15ème. Mais après ? Le 68000
s'est  détourné vers une routine qui dans le cas présent se trouve
être une partie de MONST.

Mais  comment  a-t-il trouvé cette routine ? MONST est en effet un
programme  tout à fait  ordinaire, qui  a  été chargé en mémoire à
partir  de  la disquette, et qui peut être placé n'importe où dans
cette mémoire.

Une  première solution consisterait à toujours placer ce programme
au  même  endroit. MOTOROLA  aurait ainsi pu concevoir le 68000 en
précisant: Les  programmes  de  mise  au  point qui seront appelés
grâce à la mise à 1 du bit T, devront commencer à l'adresse $5000.
Simple, mais très gênant car il devient pratiquement impossible de
faire  résider plusieurs programmes en mémoire simultanément, sans
courir le risque qu'ils se marchent sur les pieds!!!

Il y a pourtant une autre solution, un peu plus tordue mais en re-
vanche  beaucoup  plus souple, qui consiste à charger le programme
de mise au point n'importe où en mémoire, de noter l'adresse à la-
quelle  il  se trouve, et de noter cette adresse à un endroit pré-
cis. Lorsque  le 68000 trouvera le bit T à 1, il foncera à cet en-
droit  prévu  à  l'avance  par  MOTOROLA, il y trouvera non pas la
routine  mais un long mot, adresse de cette routine, à laquelle il
n'aura plus qu'à se rendre.

Cet  endroit  précis, où  sera  stocké  l'adresse  de la routine à
exécuter lorsque le bit T sera trouvé à 1, c'est un endroit qui se
situe dans le premier kilo de mémoire (donc dans les 1024 premiers
bytes). En  l'occurrence pour le mode trace il s'agit de l'adresse
$24.

Résumons: MONST  se  charge en mémoire. C'est un programme complet
dont  certaines  routines  permettent  l'affichage  des registres.
MONST  regarde  l'adresse à laquelle commencent ces routines, note
cette  adresse  puis va la mettre à l'adresse $24. Ce long mot est
donc  placé  à  l'adresse $24, $25, $26 et $27 puisque nous savons
que  le  'diamètre' du 'tube' mémoire n'est que d'un octet (byte).
Lorsque  le microprocesseur trouve le bit T à 1, il va à l'adresse
$24, il  y  prélève  un  long mot qui se trouve être l'adresse des
routines de MONST, et il fonce à cette adresse. ok?

Nous  allons maintenant réaliser un petit programme et nous allons
'planter' votre ATARI!
Tapez ce qui suit:

          MOVE.W     #$1234,D1
          MOVE.W     #$6789,D2
          MOVE.W     #$1122,D3

Assemblez  puis  taper  Alternate+D pour passer sous MONST. Faites
une fois Control+Z. Le bit T du Status register est mis à 1, indi-
quant  que nous sommes en mode Trace. Comme nous avons exécuté une
instruction, D1 se  trouve  rempli avec $1234. Appuyons maintenant
sur Alternate + 3.

Nous venons d'activer la fenêtre de droite (la numéro 3).
Appuyons  sur  Alternate+A. Une  demande  s'affiche:  nous  devons
indiquer  quelle adresse sera la première visible dans la fenêtre.
Il faut taper cette adresse en hexadécimal. Nous tapons donc...24.
(pas  de $ avant, MONST sait de lui-même que nous parlons en hexa)
Nous  voyons  s'afficher  l'adresse 24 en haut de la fenêtre et en
face un chiffre qui est l'adresse de notre routine de MONST!

Pour  moi  c'est 00027086 mais comme je l'ai dit précédemment cela
dépend des machines. Dans mon cas lorsque le 68000 trouve le bit T
à 1, il fonce donc exécuter la routine qui se trouve en $00027086.
Je vais donc modifier cette adresse! Appuyons sur Alternate+E pour
passer en mode édition. Le curseur est placé sur le premier nibble
de  l'adresse. Tapez  par exemple 11112222 ou n'importe quel autre
chiffre. 
Repassez maintenant dans la fenêtre 1 en tapant Alternate+1.

Maintenant  réfléchissons: Nous allons refaire Control+Z. Le 68000
va  foncer en $24, va maintenant y trouver $11112222, et va foncer
à cette adresse pour y exécuter ce qu'il va y trouver c'est-à-dire
n'importe quoi! Il y a très peu de chance pour qu'il réussisse à y
lire des choses cohérentes et vous indiquera une erreur.

Allez  y, n'ayez  pas  peur, vous  ne  risquez pas de casser votre
machine!

Hop  Control+Z  et, suivant  les cas, vous obtenez divers messages
(Illegal exception, Bus Error etc...). 

Quittez  en faisant Control+C ou bien en dernier ressort faites un
RESET.

J'espère  que ce principe est TRES TRES BIEN COMPRIS. Si cela vous
semble à peu près clair, relisez tout car la suite va très souvent
faire  référence  à  ce  principe  d'adresse dans le premier kilo,
contenant l'adresse d'une routine.

La  prochaine fois, nous finirons d'étudier le Status Register, en
attendant  je  vais me prendre une petite vodka bien fraîche. A la
vôtre!