COURS 3.TXT/fr: Difference between revisions

From Atari Wiki
Jump to navigation Jump to search
(Created page with "<pre> ****************************************************************** * * * COURS D'ASSEM...")
 
No edit summary
Line 4: Line 4:
 
* COURS D'ASSEMBLEUR 68000 SUR ATARI ST *
 
* COURS D'ASSEMBLEUR 68000 SUR ATARI ST *
 
* *
 
* *
* par Le F
+
* par Le F�roce Lapin (from 44E) *
 
* *
 
* *
* Cours num
+
* Cours num�ro 3 *
 
* *
 
* *
 
******************************************************************
 
******************************************************************
   
Si vous avez correctement
+
Si vous avez correctement �tudi� les deux premi�res le�ons, vous
devez normalement avoir un peu plus d'ordre qu'au d
+
devez normalement avoir un peu plus d'ordre qu'au d�part, et le
binaire et l'hexad
+
binaire et l'hexad�cimal ne doivent plus avoir de secret pour
 
vous.
 
vous.
   
 
Avant de commencer je dois vous rappeler quelque chose d'essen-
 
Avant de commencer je dois vous rappeler quelque chose d'essen-
tiel: Il est tentant de r
+
tiel: Il est tentant de r�fl�chir en chiffre alors que bien sou-
vent il serait pr
+
vent il serait pr�f�rable de se souvenir qu'un chiffre n'est
 
qu'une suite de bits. Ainsi imaginons un jeu dans lequel vous de-
 
qu'une suite de bits. Ainsi imaginons un jeu dans lequel vous de-
vez coder des donn
+
vez coder des donn�es relatives � des personnages. En lisant ces
  +
donn�es vous saurez de quel personnage il s'agit, et combien il
donnes vous saurez de quel personnage il s'agit, et combien il
 
 
lui reste de point de vie. Admettons qu'il y ait 4 personnages.
 
lui reste de point de vie. Admettons qu'il y ait 4 personnages.
Combien faut-il de bits pour compter de 0
+
Combien faut-il de bits pour compter de 0 � 3 (c'est-�-dire pour
  +
avoir 4 possibilit�s) seulement 2 bits. Mes personnages peuvent
avoir 4 possibilits) seulement 2 bits. Mes personnages peuvent
 
avoir, au maximum, 63 points de vie (de 0
+
avoir, au maximum, 63 points de vie (de 0 � 63 car � 0 ils sont
morts), il me faut donc 6 bits pour coder cette vitalit
+
morts), il me faut donc 6 bits pour coder cette vitalit�. Je peux
donc avoir sur un seul byte (octet) 2 choses totalement diff
+
donc avoir sur un seul byte (octet) 2 choses totalement diff�rent-
 
es: avec les bits 0 et 1 (le bit de droite c'est le bit 0, le bit
 
es: avec les bits 0 et 1 (le bit de droite c'est le bit 0, le bit
  +
le plus � gauche pour un byte est donc le 7) je code le type de
le plus gauche pour un byte est donc le 7) je code le type de
 
mon personnage, et avec les bits 2
+
mon personnage, et avec les bits 2 � 7 sa vitalit�.
   
Ainsi le chiffre 210 en lui m
+
Ainsi le chiffre 210 en lui m�me ne veut rien dire. C'est le fait
 
de le mettre en binaire: 11010010 et de penser en regroupement de
 
de le mettre en binaire: 11010010 et de penser en regroupement de
bits qui va le rendre plus clair. S
+
bits qui va le rendre plus clair. S�parons les 2 bits de droite:
10 ce qui fait 3 en d
+
10 ce qui fait 3 en d�cimal, je suis donc en pr�sence d'un person-
 
nage de type 3.
 
nage de type 3.
   
  +
Pr�levons maintenant les 6 bits de gauche: 110100 et conver-
Prlevons maintenant les 6 bits de gauche: 110100 et conver-
 
 
tissons.
 
tissons.
   
Nous obtenons 52. Nous sommes donc en pr
+
Nous obtenons 52. Nous sommes donc en pr�sence d'un personnage de
type 3, avec 52 points de vitalit
+
type 3, avec 52 points de vitalit�.
   
Ceci devant maintenant
+
Ceci devant maintenant �tre clair, passons � une explication
succinte concernant la m
+
succinte concernant la m�moire, avant d'aborder notre premier pro-
 
gramme.
 
gramme.
   
 
STRUCTURE DE LA MEMOIRE
 
STRUCTURE DE LA MEMOIRE
   
  +
La m�moire, c'est un tube, tr�s fin et tr�s long. Il nous faut
La mmoire, c'est un tube, trs fin et trs long. Il nous faut
 
 
distinguer 2 choses:
 
distinguer 2 choses:
   
 
1) Ce qu'il y a dans le tube.
 
1) Ce qu'il y a dans le tube.
2) La distance par rapport au d
+
2) La distance par rapport au d�but du tube.
   
ATTENTION, cette notion doit
+
ATTENTION, cette notion doit �tre parfaitement comprise car elle
  +
est perp�tuellement source d'erreur.
est perptuellement source d'erreur.
 
  +
Gr�ce � la distance, nous pourrons retrouver facilement ce que
Grce la distance, nous pourrons retrouver facilement ce que
 
nous avons mis dans le tube. Cette distance est appel
+
nous avons mis dans le tube. Cette distance est appel� 'adresse'.
   
Le tube a un diam
+
Le tube a un diam�tre de 1 byte (octet). Lorsque je vais parler de
l'adresse $6F00 (28416 en d
+
l'adresse $6F00 (28416 en d�cimal), c'est un emplacement. A cet
emplacement je peux mettre un byte. Si la donn
+
emplacement je peux mettre un byte. Si la donn�e que je veux met-
 
tre tiens sur un word (donc 2 bytes car 1 word c'est bien 2 bytes
 
tre tiens sur un word (donc 2 bytes car 1 word c'est bien 2 bytes
  +
accol�s), cette donn�e occupera l'adresse $6F00 et l'adresse
accols), cette donne occupera l'adresse $6F00 et l'adresse
 
 
$6F01.
 
$6F01.
   
Imaginons que je charge une image (32000 octets)
+
Imaginons que je charge une image (32000 octets) � partir de
l'adresse $12C52. Je vais donc boucler 32000 fois pour d
+
l'adresse $12C52. Je vais donc boucler 32000 fois pour d�poser mon
image, en augmentant
+
image, en augmentant � chaque fois mon adresse.
   
 
Imaginons maintenant que je veuille noter cette adresse. Je vais
 
Imaginons maintenant que je veuille noter cette adresse. Je vais
par exemple la noter
+
par exemple la noter � l'adresse $6F00.
   
Donc si je me prom
+
Donc si je me prom�ne le long du tube jusqu'� l'adresse $6F00 et
que je regarde
+
que je regarde � ce niveau l� dans le tube, j'y vois le chiffre
  +
$12C52 cod� sur un long mot (les adresses sont cod�s sur des longs
$12C52 cod sur un long mot (les adresses sont cods sur des longs
 
 
mots). Ce chiffre occupe donc 4 emplacements de tube correspondant
 
mots). Ce chiffre occupe donc 4 emplacements de tube correspondant
  +
� $6F00, $6F01, $6F02 ,$6F03. Or, que repr�sente ce chiffre: Une
$6F00, $6F01, $6F02 ,$6F03. Or, que reprsente ce chiffre: Une
 
adresse, celle de mon image!!!! J'esp
+
adresse, celle de mon image!!!! J'esp�re que c'est bien clair...
   
 
Un programme, c'est donc pour le 68000 une suite de lectures du
 
Un programme, c'est donc pour le 68000 une suite de lectures du
contenu du tube. Il va y trouver des chiffres qu'il va interpr
+
contenu du tube. Il va y trouver des chiffres qu'il va interpr�ter
comme des ordres (revoir le cours 2). Gr
+
comme des ordres (revoir le cours 2). Gr�ce � ces ordres, nous al-
lons lui dire par exemple de continuer la lecture
+
lons lui dire par exemple de continuer la lecture � un autre en-
droit de ce tube, de revenir en arri
+
droit de ce tube, de revenir en arri�re, de pr�lever le contenu du
tube et d'aller le d
+
tube et d'aller le d�poser autre part (toujours dans ce m�me tube
  +
bien s�r) etc... Pour savoir � quel endroit le 68000 est en train
bien sr) etc... Pour savoir quel endroit le 68000 est en train
 
de lire les ordres qu'il ex
+
de lire les ordres qu'il ex�cute, il y a un compteur. Comme ce
compteur sert pour le programme, il est appel
+
compteur sert pour le programme, il est appel� Program Counter, en
  +
abr�g� PC.
abrg PC.
 
   
Le 68000 a un PC sur 24 bits, c'est-
+
Le 68000 a un PC sur 24 bits, c'est-�-dire qu'il peut prendre des
 
valeurs comprises entre 0 et 16777215. Comme chaque valeur du PC
 
valeurs comprises entre 0 et 16777215. Comme chaque valeur du PC
  +
correspond � une adresse et qu'en face de cette adresse (donc dans
correspond une adresse et qu'en face de cette adresse (donc dans
 
le tube) on ne peut mettre qu'un octet, une machine
+
le tube) on ne peut mettre qu'un octet, une machine �quip�e d'un
 
68000 peut donc travailler avec 16777215 octets, ce qui fait 16
 
68000 peut donc travailler avec 16777215 octets, ce qui fait 16
  +
M�ga. A titre indicatif, le 80286 de chez Intel qui �quipe les
Mga. A titre indicatif, le 80286 de chez Intel qui quipe les
 
 
'gros' compatibles PC, ne comporte qu'un PC sur 20 bits ce qui
 
'gros' compatibles PC, ne comporte qu'un PC sur 20 bits ce qui
restreint son espace
+
restreint son espace � 1 m�ga...
   
A noter que la m
+
A noter que la m�moire est destin�e � recevoir des octets mais que
  +
ce que repr�sente ces octets (texte, programme, image...) n'a
ce que reprsente ces octets (texte, programme, image...) n'a
 
 
strictement aucune importance.
 
strictement aucune importance.
   
 
PREMIER PROGRAMME
 
PREMIER PROGRAMME
Nous allons tout de suite illustrer notre propos. Nous lan
+
Nous allons tout de suite illustrer notre propos. Nous lan�ons
donc GENST. Ceux qui ont un
+
donc GENST. Ceux qui ont un �cran couleur devront le lancer en
  +
moyenne r�solution, c'est pr�f�rable pour un meilleur confort de
moyenne rsolution, c'est prfrable pour un meilleur confort de
 
 
travail.
 
travail.
   
  +
M�me si vous avez un 520, choisissez dans les 'pr�f�rences' de
Mme si vous avez un 520, choisissez dans les 'prfrences' de
 
 
GENST (dans le menu 'Options') un chargement automatique de MONST
 
GENST (dans le menu 'Options') un chargement automatique de MONST
 
(Load MONST 'YES') mettez un Tab Setting de 11 et auto-indent sur
 
(Load MONST 'YES') mettez un Tab Setting de 11 et auto-indent sur
 
YES.
 
YES.
   
Si MONST est d
+
Si MONST est d�j� charg� son option dans le menu 'program' doit
  +
�tre disponible, sinon elle est en gris. Si c'est le cas, apr�s
tre disponible, sinon elle est en gris. Si c'est le cas, aprs
 
  +
avoir sauv� les pr�f�rences, quitter GENST et relancez le.
avoir sauv les prfrences, quitter GENST et relancez le.
 
   
Maintenant, nous allons r
+
Maintenant, nous allons r�aliser le programme suivant:
   
 
Met le chiffre $12345678 dans le registre D0
 
Met le chiffre $12345678 dans le registre D0
Line 127: Line 127:
   
 
Tout d'abord il faut savoir que ces ordres seront mis dans le
 
Tout d'abord il faut savoir que ces ordres seront mis dans le
tube, et qu'il nous faudra parfois rep
+
tube, et qu'il nous faudra parfois rep�rer ces endroits. Pour cela
nous utiliserons des
+
nous utiliserons des �tiquettes, que nous poserons � c�t� du tube.
  +
Ces �tiquettes (ou Label en Anglais) sont � inscrire tout � gauche
Ces tiquettes (ou Label en Anglais) sont inscrire tout gauche
 
dans notre listing alors que les instructions (ce qui est
+
dans notre listing alors que les instructions (ce qui est � mettre
DANS le tube) seront inscrites apr
+
DANS le tube) seront inscrites apr�s un espace ou mieux pour la
  +
lisibilit�, apr�s une tabulation.
lisibilit, aprs une tabulation.
 
   
 
Ainsi notre programme devient:
 
Ainsi notre programme devient:
Line 140: Line 140:
   
 
Remarquer le signe # avant les chiffres. Le signe $ indique que
 
Remarquer le signe # avant les chiffres. Le signe $ indique que
ces chiffres sont inscrits en hexad
+
ces chiffres sont inscrits en hexad�cimal. Le signe # indique que
 
c'est la valeur $12345678 que nous voulons mettre dans D0.
 
c'est la valeur $12345678 que nous voulons mettre dans D0.
   
 
Si nous avions fait MOVE.L $12345678,D0, c'est la valeur se
 
Si nous avions fait MOVE.L $12345678,D0, c'est la valeur se
  +
trouvant � l'adresse $12345678 que nous aurions mis en D0.
trouvant l'adresse $12345678 que nous aurions mis en D0.
 
   
Pourquoi y a t-il .L apr
+
Pourquoi y a t-il .L apr�s les MOVE et le ADD ? Nous verrons cela
 
dans quelques minutes.
 
dans quelques minutes.
   
Pour le moment assemblons en maintenant appuy
+
Pour le moment assemblons en maintenant appuy� [ALTERNATE] puis en
 
appuyant sur A.
 
appuyant sur A.
   
Normalement, tout s'est bien pass
+
Normalement, tout s'est bien pass� ou alors c'est que vous n'avez
pas scrupuleusement recopi
+
pas scrupuleusement recopi� ce 'programme'.
   
Maintenant, d
+
Maintenant, d�buggons notre programme, en maintenant appuy�
 
[ALTERNATE] et en appuyant sur D.
 
[ALTERNATE] et en appuyant sur D.
   
Hop, nous nous retrouvons dans MONST qui,
+
Hop, nous nous retrouvons dans MONST qui, �tant appel� � partir de
GENST, a automatiquement charg
+
GENST, a automatiquement charg� notre programme.
   
Jetons tout d'abord un coup d'oeil
+
Jetons tout d'abord un coup d'oeil � ce ramassis de chiffre...
   
En haut nous retrouvons nos registres de donn
+
En haut nous retrouvons nos registres de donn�es D0 � D7 ainsi que
nos registres d'adresses A0
+
nos registres d'adresses A0 � A7 avec en prime A7'. Sous les re-
gistres de donn
+
gistres de donn�es, nous voyons SR et en dessous PC. Nous pouvons
remarquer que PC nous montre une adresse et la premi
+
remarquer que PC nous montre une adresse et la premi�re ligne de
notre programme. Le PC indique donc ce qui va
+
notre programme. Le PC indique donc ce qui va �tre ex�cut�.
   
  +
La fen�tre du dessous (num�ro 2) montre notre programme. Sur la
La fentre du dessous (numro 2) montre notre programme. Sur la
 
gauche de cette fen
+
gauche de cette fen�tre nous voyons les adresses. Symboliquement
nous pouvons dire que la partie droite de cette fen
+
nous pouvons dire que la partie droite de cette fen�tre montre nos
 
instructions dans le tube et que les chiffres de gauche nous indi-
 
instructions dans le tube et que les chiffres de gauche nous indi-
que l'endroit, l'adresse par rapport au d
+
que l'endroit, l'adresse par rapport au d�but du tube.
   
  +
La fen�tre de droite (la 3) donne en fait la m�me chose que la 2,
La fentre de droite (la 3) donne en fait la mme chose que la 2,
 
 
mais avec la vision du 68000. Nous avions vu dans le cours 2 que
 
mais avec la vision du 68000. Nous avions vu dans le cours 2 que
pour la machine notre suite d'ordres n'
+
pour la machine notre suite d'ordres n'�tait qu'une suite de
 
chiffres.
 
chiffres.
   
Lorsque nous avons assembl
+
Lorsque nous avons assembl�, l'assembleur a simplement converti
 
ligne par ligne notre programme en chiffres.
 
ligne par ligne notre programme en chiffres.
   
Normalement dans la fen
+
Normalement dans la fen�tre 2 vous devez voir notre programme avec
en face de la premi
+
en face de la premi�re instruction, une petite fl�che. Regardez
l'adresse de cette instruction (c'est-
+
l'adresse de cette instruction (c'est-�-dire le chiffre de gauche,
 
qui indique a quel endroit dans le tube se trouve cet ordre). Avec
 
qui indique a quel endroit dans le tube se trouve cet ordre). Avec
 
un 1040 sous TOS 1.4, cela tourne autour de $61BF0.
 
un 1040 sous TOS 1.4, cela tourne autour de $61BF0.
   
NOTE: Le 68000 permet
+
NOTE: Le 68000 permet � un programme de se placer n'importe o�.
Sur certains micro-processeurs les programmes doivent imp
+
Sur certains micro-processeurs les programmes doivent imp�rati-
vement tous se placer au m
+
vement tous se placer au m�me endroit. Pour nous ce n'est pas le
 
cas, ce qui explique que si mon programme est en $61BF0 il n'en
 
cas, ce qui explique que si mon programme est en $61BF0 il n'en
est pas forcement de m
+
est pas forcement de m�me pour vous: c'est normal.
   
Regardez maintenant la fen
+
Regardez maintenant la fen�tre 3 et cherchez-y la m�me adresse que
celle que vous avez lue dans la fen
+
celle que vous avez lue dans la fen�tre 2 en face de notre pre-
  +
mi�re ligne de programme. Normalement si vous n'avez touch� � rien
mire ligne de programme. Normalement si vous n'avez touch rien
 
cette adresse doit normalement
+
cette adresse doit normalement �tre la premi�re.
   
 
Vous devez y voir 203C12345678. C'est ainsi que le micro-proces-
 
Vous devez y voir 203C12345678. C'est ainsi que le micro-proces-
  +
seur re�oit MOVE.L #$12345678,D0!!!
seur reoit MOVE.L #$12345678,D0!!!
 
   
Retournons sur la fen
+
Retournons sur la fen�tre 2. Notons l'adresse de la seconde ligne
de notre programme et soustrayons ce chiffre
+
de notre programme et soustrayons ce chiffre � l'adresse de la
  +
premi�re ligne. Nous obtenons 6. Nous en d�duisons donc que :
premire ligne. Nous obtenons 6. Nous en dduisons donc que :
 
   
MOVE.L #$12345678,D0 occupe 6 octets en m
+
MOVE.L #$12345678,D0 occupe 6 octets en m�moire.
   
 
Faisons maintenant avancer notre programme. Pour cela maintenez
 
Faisons maintenant avancer notre programme. Pour cela maintenez
  +
enfonc� [CONTROL] et appuyez une fois sur Z. La petite fl�che a
enfonc [CONTROL] et appuyez une fois sur Z. La petite flche a
 
  +
saut� sur la seconde ligne, cette m�me ligne est maintenant indi-
saut sur la seconde ligne, cette mme ligne est maintenant indi-
 
  +
qu�e par le PC et notre registre D0 contient maintenant la valeur
que par le PC et notre registre D0 contient maintenant la valeur
 
$12345678. MONST indique tous les chiffres en hexad
+
$12345678. MONST indique tous les chiffres en hexad�cimal, vous
commencez
+
commencez � comprendre l'int�r�t de la calculatrice...
   
 
Continuons en refaisant Control+Z. C'est maintenant la ligne 3 de
 
Continuons en refaisant Control+Z. C'est maintenant la ligne 3 de
notre programme qui est indiqu
+
notre programme qui est indiqu�e par le PC tandis que D1 s'est
  +
trouv� rempli par $00001012.
trouv rempli par $00001012.
 
   
 
Continuons avec Control+Z. L'addition entre D0 et D1 s'est effec-
 
Continuons avec Control+Z. L'addition entre D0 et D1 s'est effec-
  +
tu�e. Comme nous l'avions vu dans le cours 2, les possibilit�s
tue. Comme nous l'avions vu dans le cours 2, les possibilits
 
sont minimes car le r
+
sont minimes car le r�sultat a �cras� l'ancienne valeur de D1.
  +
Pour r�aliser D0+D1=D2 il aurait d'abord fallu transf�rer D1 dans
Pour raliser D0+D1=D2 il aurait d'abord fallu transfrer D1 dans
 
 
D2 puis faire ADD.L D0,D2.
 
D2 puis faire ADD.L D0,D2.
   
 
Dans notre cas, D1 contient maintenant la valeur $1234668A.
 
Dans notre cas, D1 contient maintenant la valeur $1234668A.
   
Notre programme n'ayant pas v
+
Notre programme n'ayant pas v�ritablement de fin, quittons le
 
artificiellement en tapant Control+C.
 
artificiellement en tapant Control+C.
   
Line 240: Line 240:
 
MOVE.B D1,D2
 
MOVE.B D1,D2
   
Nous avons vu dans Monst que D0-D7
+
Nous avons vu dans Monst que D0-D7 �taient des registres assez
grands. Nous avons r
+
grands. Nous avons r�ussi � mettre $12345678 dans D0, ce qui donne
  +
quand m�me 305419896 en d�cimal! En effet le 68000 est un micro-
quand mme 305419896 en dcimal! En effet le 68000 est un micro-
 
 
processeur 16/32 bits ce qui fait que ces registres ne sont pas
 
processeur 16/32 bits ce qui fait que ces registres ne sont pas
  +
cod�s sur 16 bits mais sur 32.
cods sur 16 bits mais sur 32.
 
   
 
32 bits, cela fait un long mot (Long Word). Dans notre premier
 
32 bits, cela fait un long mot (Long Word). Dans notre premier
 
programme, nous voulions que l'instruction MOVE agisse sur tout le
 
programme, nous voulions que l'instruction MOVE agisse sur tout le
 
registre donc sur un long mot, c'est pour cela que nous avions
 
registre donc sur un long mot, c'est pour cela que nous avions
  +
pr�cis� .L apr�s le move.
prcis .L aprs le move.
 
   
NOTE: Le vocabulaire est tr
+
NOTE: Le vocabulaire est tr�s important et demande un petit effort
  +
au d�but. Ainsi MOVE.L ne veut rien dire. Il convient de lire ce
au dbut. Ainsi MOVE.L ne veut rien dire. Il convient de lire ce
 
  +
mn�monique (c'est ainsi que sont appel� les instructions assem-
mnmonique (c'est ainsi que sont appel les instructions assem-
 
bleurs) MOVE LONG. D'ailleurs l'appellation mn
+
bleurs) MOVE LONG. D'ailleurs l'appellation mn�monique (qui a
rapport avec la m
+
rapport avec la m�moire, qui sert � aider la m�moire) est � rap-
procher de mn
+
procher de mn�motechnique (capable d'aider la m�moire par des
 
moyens d'association mentale qui facilitent l'acquisition et la
 
moyens d'association mentale qui facilitent l'acquisition et la
 
restitution des souvenirs /CF dictionnaire Le Robert). Autant donc
 
restitution des souvenirs /CF dictionnaire Le Robert). Autant donc
 
lire les instructions en Anglais ce qui facilitera grandement la
 
lire les instructions en Anglais ce qui facilitera grandement la
  +
compr�hension.
comprhension.
 
   
Puisque notre registre D0 (comme les autres d'ailleurs) et cod
+
Puisque notre registre D0 (comme les autres d'ailleurs) et cod�
sur un long mot, il contient donc 2 words c
+
sur un long mot, il contient donc 2 words c�te-�-c�te. Pour les
 
distinguer nous appellerons celui de gauche word de poids fort et
 
distinguer nous appellerons celui de gauche word de poids fort et
 
celui de droite word de poids faible. Chacun de ces words est lui
 
celui de droite word de poids faible. Chacun de ces words est lui
  +
m�me compos� de 2 bytes, celui de gauche �tant de poids fort et
mme compos de 2 bytes, celui de gauche tant de poids fort et
 
 
celui de droite de poids faible. De poids faible car les change-
 
celui de droite de poids faible. De poids faible car les change-
ment qu'il peut apporter
+
ment qu'il peut apporter � la totalit� du nombre sont faible alors
  +
que les donn�es de gauche (donc de poids fort) y apportent des va-
que les donnes de gauche (donc de poids fort) y apportent des va-
 
 
riations importantes.
 
riations importantes.
   
   
Assemblons notre programme et d
+
Assemblons notre programme et d�buggons.
   
  +
Ex�cutons la premi�re ligne. Le r�sultat est le m�me que pour le
Excutons la premire ligne. Le rsultat est le mme que pour le
 
premier programme: le PC indique la seconde ligne, tandis que D0
+
premier programme: le PC indique la seconde ligne, tandis que D0
  +
re�u la valeur $12345678.
reu la valeur $12345678.
 
   
Maintenant ex
+
Maintenant ex�cutons la seconde ligne. Que dit-elle ?
 
MOVE.W D0,D1
 
MOVE.W D0,D1
   
  +
C'est-�-dire d�placer le contenu de D0 pour le mettre dans D1.
C'est--dire dplacer le contenu de D0 pour le mettre dans D1.
 
Mais attention, le d
+
Mais attention, le d�placement doit se faire sur un word (pr�cis�
  +
par .W apr�s le move. Cela se lit MOVE WORD). Or les op�rations se
par .W aprs le move. Cela se lit MOVE WORD). Or les oprations se
 
font toujours sur le poids faible. Le MOVE va donc pr
+
font toujours sur le poids faible. Le MOVE va donc pr�lever le
 
word de poids faible de D0 pour le mettre dans le word de poids
 
word de poids faible de D0 pour le mettre dans le word de poids
 
faible de D1. Celui-ci va donc recevoir $5678.
 
faible de D1. Celui-ci va donc recevoir $5678.
   
Continuons en ex
+
Continuons en ex�cutant la troisi�me ligne. Celle-ci demande:
 
MOVE.B D1,D2 (move byte d1 d2)
 
MOVE.B D1,D2 (move byte d1 d2)
   
 
Donc transfert du byte de poids faible de D1 vers le byte de poids
 
Donc transfert du byte de poids faible de D1 vers le byte de poids
 
faible de D2. Regarder bien les registres et les valeurs qu'ils
 
faible de D2. Regarder bien les registres et les valeurs qu'ils
  +
re�oivent!
reoivent!
 
   
 
Quittez maintenant le programme avec CONTROL+C
 
Quittez maintenant le programme avec CONTROL+C
Line 307: Line 307:
 
MOVE.W D0,D2
 
MOVE.W D0,D2
   
On efface le programme pr
+
On efface le programme pr�c�dent, on tape celui-ci, on assemble
  +
puis on d�bugue. L'ex�cution de la premi�re et de la seconde ligne
puis on dbugue. L'excution de la premire et de la seconde ligne
 
ne doivent plus poser de probl
+
ne doivent plus poser de probl�me.
   
 
Nous devons obtenir
 
Nous devons obtenir
Line 315: Line 315:
 
D1=AAAAAAAA
 
D1=AAAAAAAA
   
  +
Ex�cutons maintenant la troisi�me ligne. Il y a bien transfert du
Excutons maintenant la troisime ligne. Il y a bien transfert du
 
 
word de poids faible de D0 vers le word de poids faible de D1.
 
word de poids faible de D0 vers le word de poids faible de D1.
 
Nous constatons que le word de poids fort de D1 N'EST PAS AFFECTE
 
Nous constatons que le word de poids fort de D1 N'EST PAS AFFECTE
par ce transfert, et qu'il reste tout
+
par ce transfert, et qu'il reste tout � fait ind�pendant du word
 
de poids faible.
 
de poids faible.
   
  +
4�me ligne. Ce mn�monique 'SWAP' (To swap= �changer) va �changer
4me ligne. Ce mnmonique 'SWAP' (To swap= changer) va changer
 
 
les 16 bits de poids faible avec les 16 bits de poids fort. D0 va
 
les 16 bits de poids faible avec les 16 bits de poids fort. D0 va
 
donc devenir 56781234.
 
donc devenir 56781234.
   
  +
Derni�re ligne. Transfert du word de poids faible de D0 (qui
Dernire ligne. Transfert du word de poids faible de D0 (qui
 
 
maintenant est 1234 et plus 5678) vers le word de poids faible de
 
maintenant est 1234 et plus 5678) vers le word de poids faible de
 
D2.
 
D2.
   
Nous avons vu que D0 contenait en fait 2 donn
+
Nous avons vu que D0 contenait en fait 2 donn�es et que ces don-
  +
n�es �taient totalement ind�pendantes. Ceci permet une grande sou-
nes taient totalement indpendantes. Ceci permet une grande sou-
 
 
plesse de travail mais demande aussi une grande rigueur car si au
 
plesse de travail mais demande aussi une grande rigueur car si au
 
lieu de faire MOVE.W D0,D1 j'avais juste commis une faute de
 
lieu de faire MOVE.W D0,D1 j'avais juste commis une faute de
frappe en tapant MOVE.L D0,D1 j'
+
frappe en tapant MOVE.L D0,D1 j'�crasais le word de poids fort de
  +
D1 et apr�s je me serais �tonn� de trouver 1234 dans D1 � l'en-
D1 et aprs je me serais tonn de trouver 1234 dans D1 l'en-
 
  +
droit o� je devrais encore trouver AAAA.
droit o je devrais encore trouver AAAA.
 
   
Nous voyons tout de suite les
+
Nous voyons tout de suite les �normes avantages de ce syst�me.
Nous n'avons
+
Nous n'avons � notre disposition que 8 'poches' de donn�es (D0 �
 
D7) mais si nous ne voulons garder que des words, nous pouvons en
 
D7) mais si nous ne voulons garder que des words, nous pouvons en
mettre 2 par poche, c'est-
+
mettre 2 par poche, c'est-�-dire 16 en tout. De m�me si notre
 
codage ne se fait que sur des bytes, c'est 32 bytes que nous pou-
 
codage ne se fait que sur des bytes, c'est 32 bytes que nous pou-
vons garder (4 par poche). Cela peut para
+
vons garder (4 par poche). Cela peut para�tre assez �vident mais
par exemple sur l'Archim
+
par exemple sur l'Archim�de, ce n'est pas possible. Sur cette ma-
 
chine, un registre contient un long word ou rien!
 
chine, un registre contient un long word ou rien!
   
  +
RESUM� DE VOCABULAIRE
RESUM DE VOCABULAIRE
 
   
 
MOVE.L = move long
 
MOVE.L = move long
Line 355: Line 355:
 
CONSEILS
 
CONSEILS
 
Prenez votre temps, relisez tranquillement ce cours et les
 
Prenez votre temps, relisez tranquillement ce cours et les
  +
pr�c�dents. Vous voyez ce n'est pas bien dur l'assembleur!
prcdents. Vous voyez ce n'est pas bien dur l'assembleur!
 
 
</pre>
 
</pre>
 
Back to [[ASM_Tutorial]]
 
Back to [[ASM_Tutorial]]

Revision as of 15:08, 23 November 2023

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

   Si  vous  avez correctement �tudi� les deux premi�res le�ons, vous
   devez  normalement  avoir  un peu plus d'ordre qu'au d�part, et le
   binaire  et  l'hexad�cimal  ne  doivent  plus avoir de secret pour
   vous.

   Avant  de  commencer  je dois vous rappeler quelque chose d'essen-
   tiel: Il  est  tentant de r�fl�chir en chiffre alors que bien sou-
   vent  il  serait  pr�f�rable  de  se  souvenir qu'un chiffre n'est
   qu'une  suite de bits. Ainsi imaginons un jeu dans lequel vous de-
   vez  coder  des donn�es relatives � des personnages. En lisant ces
   donn�es  vous  saurez  de quel personnage il s'agit, et combien il
   lui  reste  de  point de vie. Admettons qu'il y ait 4 personnages.
   Combien  faut-il  de bits pour compter de 0 � 3 (c'est-�-dire pour
   avoir  4 possibilit�s) seulement 2 bits.   Mes personnages peuvent
   avoir, au  maximum, 63 points  de  vie (de 0 � 63 car � 0 ils sont
   morts), il  me faut donc 6 bits pour coder cette vitalit�. Je peux
   donc avoir sur un seul byte (octet) 2 choses totalement diff�rent-
   es: avec  les bits 0 et 1 (le bit de droite c'est le bit 0, le bit
   le  plus  �  gauche pour un byte est donc le 7) je code le type de
   mon personnage, et avec les bits 2 � 7 sa vitalit�.

   Ainsi  le chiffre 210 en lui m�me ne veut rien dire. C'est le fait
   de  le mettre en binaire: 11010010 et de penser en regroupement de
   bits  qui  va le rendre plus clair. S�parons les 2 bits de droite:
   10 ce qui fait 3 en d�cimal, je suis donc en pr�sence d'un person-
   nage de type 3.

   Pr�levons  maintenant  les  6 bits  de  gauche: 110100 et  conver-
   tissons.

   Nous  obtenons 52. Nous sommes donc en pr�sence d'un personnage de
   type 3, avec 52 points de vitalit�.

     Ceci  devant  maintenant  �tre  clair, passons � une explication
   succinte concernant la m�moire, avant d'aborder notre premier pro-
   gramme.

   STRUCTURE DE LA MEMOIRE

   La  m�moire, c'est  un  tube, tr�s  fin et tr�s long. Il nous faut
   distinguer 2 choses:

   1) Ce qu'il y a dans le tube.
   2) La distance par rapport au d�but du tube.

   ATTENTION, cette  notion  doit �tre parfaitement comprise car elle
   est perp�tuellement source d'erreur.
   Gr�ce  �  la  distance, nous  pourrons retrouver facilement ce que
   nous avons mis dans le tube. Cette distance est appel� 'adresse'.

   Le tube a un diam�tre de 1 byte (octet). Lorsque je vais parler de
   l'adresse  $6F00 (28416 en  d�cimal), c'est  un emplacement. A cet
   emplacement je peux mettre un byte.  Si la donn�e que je veux met-
   tre  tiens sur un word (donc 2 bytes car 1 word c'est bien 2 bytes
   accol�s), cette  donn�e  occupera  l'adresse  $6F00  et  l'adresse
   $6F01.

   Imaginons  que  je  charge  une  image  (32000 octets) � partir de
   l'adresse $12C52. Je vais donc boucler 32000 fois pour d�poser mon
   image, en augmentant � chaque fois mon adresse.

   Imaginons  maintenant  que je veuille noter cette adresse. Je vais
   par exemple la noter � l'adresse $6F00.

   Donc  si  je me prom�ne le long du tube jusqu'� l'adresse $6F00 et
   que  je  regarde  � ce niveau l� dans le tube, j'y vois le chiffre
   $12C52 cod� sur un long mot (les adresses sont cod�s sur des longs
   mots). Ce chiffre occupe donc 4 emplacements de tube correspondant
   �  $6F00, $6F01, $6F02 ,$6F03. Or, que  repr�sente ce chiffre: Une
   adresse, celle de mon image!!!! J'esp�re que c'est bien clair...

   Un  programme, c'est  donc  pour le 68000 une suite de lectures du
   contenu du tube. Il va y trouver des chiffres qu'il va interpr�ter
   comme des ordres (revoir le cours 2). Gr�ce � ces ordres, nous al-
   lons  lui  dire par exemple de continuer la lecture � un autre en-
   droit de ce tube, de revenir en arri�re, de pr�lever le contenu du
   tube  et d'aller le d�poser autre part (toujours dans ce m�me tube
   bien  s�r) etc... Pour savoir � quel endroit le 68000 est en train
   de  lire  les  ordres  qu'il ex�cute, il y a un compteur. Comme ce
   compteur sert pour le programme, il est appel� Program Counter, en
   abr�g� PC.

   Le  68000 a un PC sur 24 bits, c'est-�-dire qu'il peut prendre des
   valeurs  comprises  entre 0 et 16777215. Comme chaque valeur du PC
   correspond � une adresse et qu'en face de cette adresse (donc dans
   le  tube) on  ne peut mettre qu'un octet, une machine �quip�e d'un
   68000 peut  donc  travailler  avec 16777215 octets, ce qui fait 16
   M�ga. A  titre  indicatif, le  80286 de  chez Intel qui �quipe les
   'gros' compatibles  PC, ne  comporte  qu'un  PC sur 20 bits ce qui
   restreint son espace � 1 m�ga...

   A noter que la m�moire est destin�e � recevoir des octets mais que
   ce  que  repr�sente  ces  octets  (texte, programme, image...) n'a
   strictement aucune importance.

   PREMIER PROGRAMME
   Nous  allons  tout  de  suite illustrer notre propos. Nous lan�ons
   donc  GENST. Ceux  qui  ont  un �cran couleur devront le lancer en
   moyenne  r�solution, c'est  pr�f�rable pour un meilleur confort de
   travail.

   M�me  si  vous  avez  un 520, choisissez dans les 'pr�f�rences' de
   GENST (dans le menu 'Options') un chargement automatique de MONST
   (Load  MONST 'YES') mettez un Tab Setting de 11 et auto-indent sur
   YES.

   Si  MONST  est  d�j� charg� son option dans le menu 'program' doit
   �tre  disponible, sinon  elle  est en gris. Si c'est le cas, apr�s
   avoir sauv� les pr�f�rences, quitter GENST et relancez le.

   Maintenant, nous allons r�aliser le programme suivant:

       Met le chiffre $12345678 dans le registre D0
       Met le chiffre $00001012 dans le registre D1
       Additionne le registre D0 avec le registre D1

   Tout  d'abord  il  faut  savoir  que ces ordres seront mis dans le
   tube, et qu'il nous faudra parfois rep�rer ces endroits. Pour cela
   nous utiliserons des �tiquettes, que nous poserons � c�t� du tube.
   Ces �tiquettes (ou Label en Anglais) sont � inscrire tout � gauche
   dans notre listing alors que les instructions (ce qui est � mettre
   DANS  le  tube) seront  inscrites apr�s un espace ou mieux pour la
   lisibilit�, apr�s une tabulation.

   Ainsi notre programme devient:
          MOVE.L     #$12345678,D0
          MOVE.L     #$00001012,D1
          ADD.L      D0,D1

   Remarquer  le  signe  # avant les chiffres. Le signe $ indique que
   ces  chiffres sont inscrits en hexad�cimal. Le signe # indique que
   c'est la valeur $12345678 que nous voulons mettre dans D0.

   Si  nous  avions  fait  MOVE.L   $12345678,D0,  c'est la valeur se
   trouvant � l'adresse $12345678 que nous aurions mis en D0.

   Pourquoi  y a t-il .L apr�s les MOVE et le ADD ? Nous verrons cela
   dans quelques minutes.

   Pour le moment assemblons en maintenant appuy� [ALTERNATE] puis en
   appuyant sur A.

   Normalement, tout  s'est bien pass� ou alors c'est que vous n'avez
   pas scrupuleusement recopi� ce 'programme'. 

   Maintenant,  d�buggons   notre  programme,  en  maintenant  appuy�
   [ALTERNATE] et en appuyant sur D.

   Hop, nous nous retrouvons dans MONST qui, �tant appel� � partir de
   GENST, a automatiquement charg� notre programme.

   Jetons tout d'abord un coup d'oeil � ce ramassis de chiffre...

   En haut nous retrouvons nos registres de donn�es D0 � D7 ainsi que
   nos  registres  d'adresses A0 � A7 avec en prime A7'. Sous les re-
   gistres  de donn�es, nous voyons SR et en dessous PC. Nous pouvons
   remarquer  que  PC nous montre une adresse et la premi�re ligne de
   notre programme. Le PC indique donc ce qui va �tre ex�cut�.

   La  fen�tre  du  dessous (num�ro 2) montre notre programme. Sur la
   gauche  de  cette fen�tre nous voyons les adresses. Symboliquement
   nous pouvons dire que la partie droite de cette fen�tre montre nos
   instructions dans le tube et que les chiffres de gauche nous indi-
   que l'endroit, l'adresse par rapport au d�but du tube.

   La  fen�tre de droite (la 3) donne en fait la m�me chose que la 2,
   mais  avec  la vision du 68000. Nous avions vu dans le cours 2 que
   pour  la  machine  notre  suite  d'ordres  n'�tait qu'une suite de
   chiffres.

   Lorsque  nous  avons  assembl�, l'assembleur a simplement converti
   ligne par ligne notre programme en chiffres.

   Normalement dans la fen�tre 2 vous devez voir notre programme avec
   en  face  de  la premi�re instruction, une petite fl�che. Regardez
   l'adresse de cette instruction (c'est-�-dire le chiffre de gauche,
   qui indique a quel endroit dans le tube se trouve cet ordre). Avec
   un 1040 sous TOS 1.4, cela tourne autour de $61BF0.

   NOTE: Le 68000 permet � un programme de se placer n'importe o�.
   Sur  certains  micro-processeurs  les programmes doivent imp�rati-
   vement  tous  se placer au m�me endroit. Pour nous ce n'est pas le
   cas, ce  qui  explique  que si mon programme est en $61BF0 il n'en
   est pas forcement de m�me pour vous: c'est normal.

   Regardez maintenant la fen�tre 3 et cherchez-y la m�me adresse que
   celle  que  vous  avez lue dans la fen�tre 2 en face de notre pre-
   mi�re ligne de programme. Normalement si vous n'avez touch� � rien
   cette adresse doit normalement �tre la premi�re.

   Vous  devez  y voir 203C12345678. C'est ainsi que le micro-proces-
   seur re�oit MOVE.L #$12345678,D0!!!

   Retournons  sur la fen�tre 2. Notons l'adresse de la seconde ligne
   de  notre  programme  et  soustrayons ce chiffre � l'adresse de la
   premi�re ligne. Nous obtenons 6. Nous en d�duisons donc que :

   MOVE.L   #$12345678,D0  occupe 6 octets en m�moire.

   Faisons  maintenant  avancer  notre programme. Pour cela maintenez
   enfonc�  [CONTROL]  et  appuyez une fois sur Z. La petite fl�che a
   saut�  sur la seconde ligne, cette m�me ligne est maintenant indi-
   qu�e  par le PC et notre registre D0 contient maintenant la valeur
   $12345678. MONST  indique  tous  les chiffres en hexad�cimal, vous
   commencez � comprendre l'int�r�t de la calculatrice...

   Continuons  en refaisant Control+Z. C'est maintenant la ligne 3 de
   notre  programme  qui  est  indiqu�e par le PC tandis que D1 s'est
   trouv� rempli par $00001012.

   Continuons  avec Control+Z. L'addition entre D0 et D1 s'est effec-
   tu�e. Comme  nous  l'avions  vu  dans le cours 2, les possibilit�s
   sont  minimes  car  le  r�sultat a �cras� l'ancienne valeur de D1.
   Pour  r�aliser D0+D1=D2 il aurait d'abord fallu transf�rer D1 dans
   D2 puis faire ADD.L  D0,D2.

   Dans notre cas, D1 contient maintenant la valeur $1234668A.

   Notre  programme  n'ayant  pas  v�ritablement  de fin, quittons le
   artificiellement en tapant Control+C. 


   SECOND PROGRAMME

   Effacer le premier programme (alternate C) et tapez le suivant:

          MOVE.L     #$12345678,D0
          MOVE.W     D0,D1
          MOVE.B     D1,D2

   Nous  avons  vu  dans  Monst que D0-D7 �taient des registres assez
   grands. Nous avons r�ussi � mettre $12345678 dans D0, ce qui donne
   quand  m�me  305419896 en d�cimal! En effet le 68000 est un micro-
   processeur  16/32 bits  ce  qui fait que ces registres ne sont pas
   cod�s sur 16 bits mais sur 32.

   32 bits, cela  fait  un  long  mot (Long Word). Dans notre premier
   programme, nous voulions que l'instruction MOVE agisse sur tout le
   registre  donc  sur  un  long mot, c'est pour cela que nous avions
   pr�cis� .L apr�s le move.

   NOTE: Le vocabulaire est tr�s important et demande un petit effort
   au  d�but. Ainsi  MOVE.L ne veut rien dire. Il convient de lire ce
   mn�monique  (c'est  ainsi  que sont appel� les instructions assem-
   bleurs) MOVE  LONG. D'ailleurs  l'appellation  mn�monique  (qui  a
   rapport  avec  la m�moire, qui sert � aider la m�moire) est � rap-
   procher  de  mn�motechnique  (capable  d'aider  la m�moire par des
   moyens  d'association  mentale  qui facilitent l'acquisition et la
   restitution des souvenirs /CF dictionnaire Le Robert). Autant donc
   lire  les  instructions en Anglais ce qui facilitera grandement la
   compr�hension.

   Puisque  notre  registre  D0 (comme les autres d'ailleurs) et cod�
   sur  un  long  mot, il contient donc 2 words c�te-�-c�te. Pour les
   distinguer  nous appellerons celui de gauche word de poids fort et
   celui  de droite word de poids faible. Chacun de ces words est lui
   m�me  compos�  de  2 bytes, celui de gauche �tant de poids fort et
   celui  de  droite de poids faible. De poids faible car les change-
   ment qu'il peut apporter � la totalit� du nombre sont faible alors
   que les donn�es de gauche (donc de poids fort) y apportent des va-
   riations importantes.


   Assemblons notre programme et d�buggons.

   Ex�cutons  la  premi�re ligne. Le r�sultat est le m�me que pour le
   premier programme: le PC indique la seconde ligne, tandis que D0 �
   re�u la valeur $12345678.

   Maintenant ex�cutons la seconde ligne. Que dit-elle ?
   MOVE.W   D0,D1

   C'est-�-dire  d�placer  le  contenu  de D0 pour le mettre dans D1.
   Mais  attention, le d�placement doit se faire sur un word (pr�cis�
   par .W apr�s le move. Cela se lit MOVE WORD). Or les op�rations se
   font  toujours  sur  le  poids faible. Le MOVE va donc pr�lever le
   word  de  poids  faible de D0 pour le mettre dans le word de poids
   faible de D1. Celui-ci va donc recevoir $5678. 

   Continuons  en  ex�cutant  la  troisi�me  ligne. Celle-ci demande:
   MOVE.B   D1,D2       (move byte d1 d2)

   Donc transfert du byte de poids faible de D1 vers le byte de poids
   faible  de  D2. Regarder  bien les registres et les valeurs qu'ils
   re�oivent!

   Quittez maintenant le programme avec CONTROL+C


   TROISIEME PROGRAMME

          MOVE.L     #$12345678,D0
          MOVE.L     #$AAAAAAAA,D1
          MOVE.W     D0,D1
          SWAP       D0
          MOVE.W     D0,D2

   On  efface  le  programme pr�c�dent, on tape celui-ci, on assemble
   puis on d�bugue. L'ex�cution de la premi�re et de la seconde ligne
   ne doivent plus poser de probl�me.

   Nous devons obtenir
   D0=12345678
   D1=AAAAAAAA

   Ex�cutons  maintenant la troisi�me ligne. Il y a bien transfert du
   word  de  poids  faible  de D0 vers le word de poids faible de D1.
   Nous  constatons que le word de poids fort de D1 N'EST PAS AFFECTE
   par  ce  transfert, et qu'il reste tout � fait ind�pendant du word
   de poids faible.

   4�me  ligne. Ce  mn�monique 'SWAP' (To swap= �changer) va �changer
   les  16 bits de poids faible avec les 16 bits de poids fort. D0 va
   donc devenir 56781234.

   Derni�re  ligne. Transfert  du  word  de  poids  faible de D0 (qui
   maintenant  est 1234 et plus 5678) vers le word de poids faible de
   D2.

   Nous  avons  vu que D0 contenait en fait 2 donn�es et que ces don-
   n�es �taient totalement ind�pendantes. Ceci permet une grande sou-
   plesse  de travail mais demande aussi une grande rigueur car si au
   lieu  de  faire  MOVE.W  D0,D1 j'avais  juste  commis une faute de
   frappe en tapant MOVE.L  D0,D1 j'�crasais le word de poids fort de
   D1 et  apr�s  je  me serais �tonn� de trouver 1234 dans D1 � l'en-
   droit o� je devrais encore trouver AAAA.

   Nous  voyons  tout  de  suite les �normes avantages de ce syst�me.
   Nous  n'avons  � notre disposition que 8 'poches' de donn�es (D0 �
   D7) mais  si nous ne voulons garder que des words, nous pouvons en
   mettre  2 par  poche, c'est-�-dire  16 en  tout. De  m�me si notre
   codage  ne se fait que sur des bytes, c'est 32 bytes que nous pou-
   vons  garder  (4 par poche). Cela peut para�tre assez �vident mais
   par  exemple sur l'Archim�de, ce n'est pas possible. Sur cette ma-
   chine, un registre contient un long word ou rien!

   RESUM� DE VOCABULAIRE

   MOVE.L = move long
   MOVE.W = move word
   MOVE.B = move byte


   CONSEILS
   Prenez  votre  temps,  relisez  tranquillement  ce  cours  et  les
   pr�c�dents. Vous voyez ce n'est pas bien dur l'assembleur!

Back to ASM_Tutorial