COURS 6.TXT/fr: Difference between revisions

From Atari Wiki
Jump to navigation Jump to search
(Created page with "<pre> ****************************************************************** * * * COURS D'ASSEMBL...")
 
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 6 *
 
* *
 
* *
 
******************************************************************
 
******************************************************************
   
−
LA PILE Nous avons d
+
LA PILE Nous avons d�j� utilis� la notion de 'tube' en ce qui
−
concerne la m
+
concerne la m�moire. Nous pouvons y stocker diff�rentes choses, et
−
si nous nous rappelons l'adresse, nous pouvons revenir plus tard
+
si nous nous rappelons l'adresse, nous pouvons revenir plus tard �
−
cet endroit pour y r
+
cet endroit pour y r�cup�rer ce que nous y avions d�pos�.
   
 
Essayez avec ce petit programme:
 
Essayez avec ce petit programme:
Line 22: Line 22:
 
MOVE.L $493E0,D0
 
MOVE.L $493E0,D0
   
−
Assemblez puis passez sous MONST. Avancez en pas
+
Assemblez puis passez sous MONST. Avancez en pas � pas. D0 est
−
d'abord rempli avec $12345678, puis le contenu de D0 est transf
+
d'abord rempli avec $12345678, puis le contenu de D0 est transf�r�
  +
� l'adresse $493E0. Notez bien qu'il n'y a pas de # devant $493E0,
−
… l'adresse $493E0. Notez bien qu'il n'y a pas de # devant $493E0,
 
−
afin d'indiquer qu'il s'agit bien d'une adresse. Cette ligne
+
afin d'indiquer qu'il s'agit bien d'une adresse. Cette ligne �tant
  +
ex�cut�e, activez la fen�tre 3 ([Alternate+3]) et placez le d�but
−
ex‚cut‚e, activez la fenˆtre 3 ([Alternate+3]) et placez le d‚but
 
 
de celle-ci sur l'adresse $493E0 ([Alternate+A] puis tapez 493E0)
 
de celle-ci sur l'adresse $493E0 ([Alternate+A] puis tapez 493E0)
−
Vous voyez bien 12345678
+
Vous voyez bien 12345678 � cet endroit dans le 'tube'. Si j'ai
−
choisit cette adresse c'est parce qu'elle se situe
+
choisit cette adresse c'est parce qu'elle se situe � 300 Kilo du
  +
d�but de la m�moire. Elle est donc accessible m�me sur un 520, et
−
d‚but de la m‚moire. Elle est donc accessible mˆme sur un 520, et
 
−
elle est suffisamment
+
elle est suffisamment �loign�e pour ne pas se trouver dans GENST
−
ou MONST. En effet il n'y a qu'un 'tube' m
+
ou MONST. En effet il n'y a qu'un 'tube' m�moire! Nous sommes donc
−
en train d'
+
en train d'�crire dans la m�moire alors qu'une partie de celle-ci
  +
est occup�e par GENST et MONST! Ecrire � l'int�rieur des zones oc-
−
est occup‚e par GENST et MONST! Ecrire … l'int‚rieur des zones oc-
 
  +
cup�es par ces programmes est possible, ce qui entra�nera tr�s
−
cup‚es par ces programmes est possible, ce qui entraŒnera trŠs
 
 
certainement quelques plantages de ceux-ci!
 
certainement quelques plantages de ceux-ci!
   
−
Continuons en pas
+
Continuons en pas � pas, nous mettons D0 � 0 puis le contenu de
 
l'adresse $493E0 (sans #) est remis dans D0.
 
l'adresse $493E0 (sans #) est remis dans D0.
   
−
La pile, c'est une partie de ce tube, mais que nous allons g
+
La pile, c'est une partie de ce tube, mais que nous allons g�rer
  +
d'une mani�re un peu diff�rente. En effet, au lieu de placer les
−
d'une maniŠre un peu diff‚rente. En effet, au lieu de placer les
 
  +
donn�es dans le tube et de noter leurs adresses, nous allons cette
−
donn‚es dans le tube et de noter leurs adresses, nous allons cette
 
−
fois-ci les empiler et pour les r
+
fois-ci les empiler et pour les r�cup�rer, les d�piler. L'avantage
−
c'est le gain de temps (pas la peine de se demander
+
c'est le gain de temps (pas la peine de se demander � quelle
−
adresse on a stock
+
adresse on a stock� les donn�es) et un gain de place (si c'est
−
pour stocker temporairement des donn
+
pour stocker temporairement des donn�es, inutile de conserver une
−
portion de 'tube' juste pour
+
portion de 'tube' juste pour �a).
   
−
Par contre l'inconv
+
Par contre l'inconv�nient c'est que la gestion doit �tre rigou-
 
reuse. Imaginons que j'empile un premier chiffre puis 10 autres
 
reuse. Imaginons que j'empile un premier chiffre puis 10 autres
−
par dessus. Ensuite je d
+
par dessus. Ensuite je d�pile, mais erreur de ma part, je ne
  +
d�pile que 9 chiffres! Quand je d�pilerai une fois de plus,
−
d‚pile que 9 chiffres! Quand je d‚pilerai une fois de plus,
 
−
croyant retrouver le premier chiffre empil
+
croyant retrouver le premier chiffre empil�, je r�cup�rerai en
−
fait le premier de la s
+
fait le premier de la s�rie de 10.
   
 
Nous en concluons 2 choses: d'abord que la pile est un moyen sim-
 
Nous en concluons 2 choses: d'abord que la pile est un moyen sim-
−
ple pour sauvegarder des donn
+
ple pour sauvegarder des donn�es, mais ensuite que c'est une
  +
source de d�sagr�ment potentiel, tel que certains programmeurs h�-
−
source de d‚sagr‚ment potentiel, tel que certains programmeurs h‚-
 
  +
site � s'en servir. C'est g�n�ralement � cause d'un manque de ri-
−
site … s'en servir. C'est g‚n‚ralement … cause d'un manque de ri-
 
−
gueur ce qui, je l'esp
+
gueur ce qui, je l'esp�re ne vous arrivera pas.
   
−
Une autre remarque: le dernier
+
Une autre remarque: le dernier �l�ment plac� sur la pile sera tou-
−
jours le premier
+
jours le premier � en sortir. C'est bien le m�me principe que ce-
−
lui d'une pile d'assiettes: Regardez chez vous, il y a s
+
lui d'une pile d'assiettes: Regardez chez vous, il y a s�rement
  +
une �norme pile d'assiettes, mais par le simple fait que le range-
−
une ‚norme pile d'assiettes, mais par le simple fait que le range-
 
  +
ment apr�s le lavage se fait par empilage et que mettre la table
−
ment aprŠs le lavage se fait par empilage et que mettre la table
 
−
se fait par d
+
se fait par d�pilage, vous mangez en fait toujours dans les m�mes
−
assiettes... (d'o
+
assiettes... (d'o� l'int�r�t de bien faire la vaisselle!)
   
−
Cette structure de pile est appel
+
Cette structure de pile est appel�e structure LIFO, c'est-�-dire
−
Last In First Out, en Fran
+
Last In First Out, en Fran�ais: 'dernier entr� premier sorti'.
−
Cette structure est diff
+
Cette structure est diff�rente d'une autre structure fr�quemment
  +
rencontr�e en informatique, celle de la file, appel�e aussi struc-
−
rencontr‚e en informatique, celle de la file, appel‚e aussi struc-
 
−
ture FIFO (First In First Out), la file
+
ture FIFO (First In First Out), la file �tant similaire � une
 
file d'attente devant un guichet: le premier dans la file sera le
 
file d'attente devant un guichet: le premier dans la file sera le
 
premier parti.
 
premier parti.
   
  +
Mais concr�tement, � quoi sert la pile? Nous allons le voir avec
−
Mais concrŠtement, … quoi sert la pile? Nous allons le voir avec
 
 
un exemple. Tapez le programme suivant:
 
un exemple. Tapez le programme suivant:
   
Line 96: Line 96:
 
RTS
 
RTS
   
  +
Premi�re remarque: ce programme diff�re des pr�c�dents par le fait
−
PremiŠre remarque: ce programme diffŠre des pr‚c‚dents par le fait
 
−
que nous utilisons une
+
que nous utilisons une �tiquette, un label qui se nomme AJOUTE.
   
−
Ce mot, 'AJOUTE', doit se trouver tout
+
Ce mot, 'AJOUTE', doit se trouver tout � gauche, contre le bord de
  +
la fen�tre de l'�diteur. Ce n'est pas quelque chose � placer DANS
−
la fenˆtre de l'‚diteur. Ce n'est pas quelque chose … placer DANS
 
 
le tube mais bien une marque A COTE du tube.
 
le tube mais bien une marque A COTE du tube.
   
 
Autre remarque, les listings en assembleur, contrairement aux lis-
 
Autre remarque, les listings en assembleur, contrairement aux lis-
−
tings dans les autres langages sont assez libres au niveau pr
+
tings dans les autres langages sont assez libres au niveau pr�sen-
 
tation. Il est tout a fait possible de passer des lignes, ce qui
 
tation. Il est tout a fait possible de passer des lignes, ce qui
−
est fait ici pour s
+
est fait ici pour s�parer les 2 parties. Les sources assembleur
−
sont bien souvent tr
+
sont bien souvent tr�s longs, et m�me si cela fait perdre quelques
 
lignes, espacer les modules permet de s'y retrouver plus faci-
 
lignes, espacer les modules permet de s'y retrouver plus faci-
 
lement.
 
lement.
   
−
Assemblons puis d
+
Assemblons puis d�buggons. Avan�ons pas � pas avec Control+Z. Les
  +
3 premi�res lignes nous sont famili�res mais pas la quatri�me.
−
3 premiŠres lignes nous sont familiŠres mais pas la quatriŠme.
 
−
Celle-ci se lit BRANCH SUB ROUTINE AJOUTE, c'est-
+
Celle-ci se lit BRANCH SUB ROUTINE AJOUTE, c'est-�-dire branche-
  +
ment � une subroutine nomm�e AJOUTE. Pour pr�ciser vers quelle su-
−
ment … une subroutine nomm‚e AJOUTE. Pour pr‚ciser vers quelle su-
 
−
broutine on d
+
broutine on d�sire se diriger, son �tiquette est pr�cis�e. Ici en
 
l'occurrence c'est AJOUTE mais le nom importe peu. Il est tout a
 
l'occurrence c'est AJOUTE mais le nom importe peu. Il est tout a
 
fait possible de mettre des noms assez longs et je ne peux que
 
fait possible de mettre des noms assez longs et je ne peux que
−
vous conseiller d'
+
vous conseiller d'�viter dans vos listings les noms du genre X Y,
−
Z ou encore AX1 etc... qui sont quand m
+
Z ou encore AX1 etc... qui sont quand m�me moins explicites que
 
DEBUT_IMAGE, NEW_PALETTE ou bien END_GAME.
 
DEBUT_IMAGE, NEW_PALETTE ou bien END_GAME.
   
−
Maintenant soyez tr
+
Maintenant soyez tr�s attentifs: � la lecture de cette instruction
 
de nombreuses choses vont se passer. L'ordre demande donc au 68000
 
de nombreuses choses vont se passer. L'ordre demande donc au 68000
 
de poursuivre la lecture de ses instructions dans un sous
 
de poursuivre la lecture de ses instructions dans un sous
−
programme dont le d
+
programme dont le d�but se situe dans le tube, en face de l'�ti-
 
quette AJOUTE. Cependant il s'agit bien ici d'un sous-programme.
 
quette AJOUTE. Cependant il s'agit bien ici d'un sous-programme.
−
Ceci suppose qu'une fois termin
+
Ceci suppose qu'une fois termin�, le 68000 remontera pour ex�cuter
 
la ligne qui suit BSR AJOUTE, en l'occurrence MOVE.L #0,D0. Ques-
 
la ligne qui suit BSR AJOUTE, en l'occurrence MOVE.L #0,D0. Ques-
−
tion: comment le 68000 saura-t-il o
+
tion: comment le 68000 saura-t-il o� remonter? En effet le propre
−
d'une subroutine est de pouvoir
+
d'une subroutine est de pouvoir �tre appel�e plusieurs fois et de
−
plusieurs endroits diff
+
plusieurs endroits diff�rents et de pouvoir � chaque fois revenir
  +
� l'endroit m�me qui l'a appel�.
−
… l'endroit mˆme qui l'a appel‚.
 
   
 
Eh bien le 68000 va justement utiliser la pile pour noter ce lieu
 
Eh bien le 68000 va justement utiliser la pile pour noter ce lieu
−
de retour. Cette pile a bien sur une adresse, o
+
de retour. Cette pile a bien sur une adresse, o� se trouve-t-elle
  +
not�e? En A7. Et oui, ce registre un peu sp�cial correspond � la
−
not‚e? En A7. Et oui, ce registre un peu sp‚cial correspond … la
 
 
pile.
 
pile.
   
−
Mais A7' alors? Et bien c'est aussi une pile, mais r
+
Mais A7' alors? Et bien c'est aussi une pile, mais r�serv�e au
 
mode Superviseur. Ainsi si nous faisions tourner conjointement 2
 
mode Superviseur. Ainsi si nous faisions tourner conjointement 2
 
programmes, l'un en mode utilisateur et l'autre en superviseur,
 
programmes, l'un en mode utilisateur et l'autre en superviseur,
 
chacun aurait sa pile.
 
chacun aurait sa pile.
   
  +
Avant d'ex�cuter la ligne BSR AJOUTE, observons attentivement les
−
Avant d'ex‚cuter la ligne BSR AJOUTE, observons attentivement les
 
−
registres d'adresses et les registres de donn
+
registres d'adresses et les registres de donn�es.
   
−
Nous avons vu que les registres, qu'ils soient de donn
+
Nous avons vu que les registres, qu'ils soient de donn�es ou
−
d'adresse, peuvent contenir des nombres cod
+
d'adresse, peuvent contenir des nombres cod�s sur 32 bits. Nous
 
avons vu aussi qu'il existait 2 sortes de nombres pour la machine:
 
avons vu aussi qu'il existait 2 sortes de nombres pour la machine:
−
ceux se trouvant
+
ceux se trouvant � l'int�rieur du 'tube' et ceux ce trouvant �
  +
l'ext�rieur, CONTRE ce tube, et indiquant une sorte de distance
−
l'ext‚rieur, CONTRE ce tube, et indiquant une sorte de distance
 
−
par rapport au d
+
par rapport au d�but de celui-ci.
   
−
Ce second type de nombre est appel
+
Ce second type de nombre est appel� adresse. Or il est tout � fait
−
possible de stocker un nombre repr
+
possible de stocker un nombre repr�sentant une adresse dans un
−
registre de donn
+
registre de donn�es (D0-D7). Imaginons maintenant que nous devions
 
stocker le score d'un joueur dans le jeu que nous programmons. Ce
 
stocker le score d'un joueur dans le jeu que nous programmons. Ce
−
score va par exemple
+
score va par exemple �tre plac� dans la m�moire (dans le 'tube') �
 
l'adresse $80792.
 
l'adresse $80792.
   
−
Mais que se passera-t-il si nous transf
+
Mais que se passera-t-il si nous transf�rons cette adresse pour
  +
l'utiliser gr�ce � A1 par exemple? et bien A1 va prendre la valeur
−
l'utiliser grƒce … A1 par exemple? et bien A1 va prendre la valeur
 
−
$80792. C'est bien joli, mais ce qui nous int
+
$80792. C'est bien joli, mais ce qui nous int�resse, ce n'est pas
  +
�a! Ce que nous voulons modifier, v�rifier etc.. c'est ce qu'il y
−
‡a! Ce que nous voulons modifier, v‚rifier etc.. c'est ce qu'il y
 
−
a DANS le tube
+
a DANS le tube � cette adresse.
   
−
Et bien notre d
+
Et bien notre d�bugger anticipe un peu cette demande. En effet,
−
partant du principe que les nombres stock
+
partant du principe que les nombres stock�s en D0-D7 ou A0-A6 peu-
  +
vent repr�senter des valeurs d'adresses, il indique � c�t� des re-
−
vent repr‚senter des valeurs d'adresses, il indique … c“t‚ des re-
 
−
gistres, ce qu'il y a dans le tube,
+
gistres, ce qu'il y a dans le tube, � l'adresse indiqu�e dans le
 
registre.
 
registre.
   
−
En ce qui concerne les registres de donn
+
En ce qui concerne les registres de donn�es, MONST affiche � leur
−
droite la valeur de 8 octets se trouvant dans le tube
+
droite la valeur de 8 octets se trouvant dans le tube � l'adresse
  +
indiqu�e dans le registre. Pour les registres d'adresse, ce sont
−
indiqu‚e dans le registre. Pour les registres d'adresse, ce sont
 
−
10 octets qui sont indiqu
+
10 octets qui sont indiqu�s. Vous remarquez certainement qu'en
 
face du registre D0 (qui doit contenir $12345678 si vous avez fait
 
face du registre D0 (qui doit contenir $12345678 si vous avez fait
−
correctement avancer le programme), MONST n'a affich
+
correctement avancer le programme), MONST n'a affich� que des
  +
�toiles. C'est normal car le nombre $12345678 correspond � un em-
−
‚toiles. C'est normal car le nombre $12345678 correspond … un em-
 
  +
placement m�moire qui se serait accessible qu'avec 305 m�ga de
−
placement m‚moire qui se serait accessible qu'avec 305 m‚ga de
 
  +
m�moire!!! MONST indique donc qu'il ne peut pas atteindre cette
−
m‚moire!!! MONST indique donc qu'il ne peut pas atteindre cette
 
  +
zone m�moire en affichant des �toiles.
−
zone m‚moire en affichant des ‚toiles.
 
   
−
Regardons maintenant D1 et A0. Les nombres situ
+
Regardons maintenant D1 et A0. Les nombres situ�s � leur droite
−
montrent la m
+
montrent la m�me chose, ce qui est normal puisque les 2 registres
−
D1 et A0 sont remplis avec le m
+
D1 et A0 sont remplis avec le m�me nombre. On dit qu'ils pointent
−
sur l'adresse $BD88. Allons voir en m
+
sur l'adresse $BD88. Allons voir en m�moire histoire de v�rifier
−
l'affichage. Activez la fen
+
l'affichage. Activez la fen�tre 3 avec Alternate+3. Celle-ci nous
−
affiche le contenu de la m
+
affiche le contenu de la m�moire, mais nous sommes loin de $BD88!
   
−
Demandons donc que cette adresse soit celle du haut de la fen
+
Demandons donc que cette adresse soit celle du haut de la fen�tre
−
3, avec Alternate+A. Tapons cette adresse (BD88). La fen
+
3, avec Alternate+A. Tapons cette adresse (BD88). La fen�tre 3 se
  +
r� affiche avec en haut l'adresse $BD88. Dans la colonne de droite
−
r‚ affiche avec en haut l'adresse $BD88. Dans la colonne de droite
 
−
nous voyons le contenu de la m
+
nous voyons le contenu de la m�moire, dont nous avions d�j� un
  +
aper�u avec l'affichage � droite de D1 et de A0. C'est clair?
−
aper‡u avec l'affichage … droite de D1 et de A0. C'est clair?
 
   
  +
R�activons la fen�tre 1 (alternate+1). Normalement la petite fl�-
−
R‚activons la fenˆtre 1 (alternate+1). Normalement la petite flŠ-
 
 
che doit toujours se trouvez en face du BSR AJOUTE. Noter le
 
che doit toujours se trouvez en face du BSR AJOUTE. Noter le
 
chiffre se trouvant dans le registre A7 (donc l'adresse de la
 
chiffre se trouvant dans le registre A7 (donc l'adresse de la
−
pile) et observer bien les chiffres
+
pile) et observer bien les chiffres � droite de ce registre, tout
 
en faisant Control+Z.
 
en faisant Control+Z.
   
−
Les chiffres ont chang
+
Les chiffres ont chang�! D'abord le registre A7 ne contient plus
  +
le m�me nombre. Celui qui s'y trouve actuellement est en effet
−
le mˆme nombre. Celui qui s'y trouve actuellement est en effet
 
−
plus petit que le pr
+
plus petit que le pr�c�dent. Notons que cette diff�rence est de 4.
−
L'adresse de la pile a donc
+
L'adresse de la pile a donc �t� d�cr�ment�e de 4. De plus des
−
chiffres ont
+
chiffres ont �t� plac�s dans la pile (on les voit � droite du
−
registre A7). Or, regardez bien le nombre qui est
+
registre A7). Or, regardez bien le nombre qui est � gauche de
−
l'instruction MOVE.L #0,D0 de notre programme, c'est-
+
l'instruction MOVE.L #0,D0 de notre programme, c'est-�-dire
  +
l'adresse � laquelle devra revenir le 68000 une fois la subroutine
−
l'adresse … laquelle devra revenir le 68000 une fois la subroutine
 
  +
termin�e: c'est bien ce nombre qui a �t� plac� dans la pile. Il y
−
termin‚e: c'est bien ce nombre qui a ‚t‚ plac‚ dans la pile. Il y
 
−
a donc empilage de l'adresse de retour, ce qui explique
+
a donc empilage de l'adresse de retour, ce qui explique �galement
 
le changement d'adresse de la pile de 4. En effet une adresse est
 
le changement d'adresse de la pile de 4. En effet une adresse est
  +
cod�e sur 4 octets !
−
cod‚e sur 4 octets !
 
   
  +
Note: �tant donn� que nous parlons de pile, on dit plus souvent
−
Note: ‚tant donn‚ que nous parlons de pile, on dit plus souvent
 
  +
que les donn�es sont mises sur la pile et moins souvent dans la
−
que les donn‚es sont mises sur la pile et moins souvent dans la
 
 
pile.
 
pile.
   
 
Continuons notre programme avec Control+Z. Nous sommes maintenant
 
Continuons notre programme avec Control+Z. Nous sommes maintenant
−
dans la sous-routine. Arr
+
dans la sous-routine. Arr�tez juste avant RTS. C'est cette ins-
 
truction qui va nous faire "remonter". Elle se lit RETURN FROM SUB
 
truction qui va nous faire "remonter". Elle se lit RETURN FROM SUB
 
ROUTINE.
 
ROUTINE.
   
−
Observons A7 (sa valeur mais aussi le contenu du 'tube'
+
Observons A7 (sa valeur mais aussi le contenu du 'tube' � cette
−
adresse) et faisons un pas (Control+Z). L'adresse de retour a
+
adresse) et faisons un pas (Control+Z). L'adresse de retour a �t�
  +
d�pil�e, A7 a repris son ancienne adresse et nous pointons mainte-
−
d‚pil‚e, A7 a repris son ancienne adresse et nous pointons mainte-
 
 
nant sur MOVE.L #0,D0.
 
nant sur MOVE.L #0,D0.
   
Line 242: Line 242:
 
RTS
 
RTS
   
−
Assemblez puis d
+
Assemblez puis d�buggez. Avancez pas � pas: D0 prend la valeur
 
$12345678 D1 la valeur AAAAAAAA, puis nous partons vers la subrou-
 
$12345678 D1 la valeur AAAAAAAA, puis nous partons vers la subrou-
 
tine AJOUTE.
 
tine AJOUTE.
   
 
Malheureusement celle-ci utilise D1 et au retour nous constatons
 
Malheureusement celle-ci utilise D1 et au retour nous constatons
−
que celui-ci ne contient plus AAAAAAAA. En effet le branchement
+
que celui-ci ne contient plus AAAAAAAA. En effet le branchement �
 
une subroutine ne sauve rien d'autre que l'adresse de retour, et
 
une subroutine ne sauve rien d'autre que l'adresse de retour, et
 
en assembleur les variables locales et autres bidouilles de langa-
 
en assembleur les variables locales et autres bidouilles de langa-
  +
ges �volu�s n'existent pas! C'est donc � nous de sauver les regis-
−
ges ‚volu‚s n'existent pas! C'est donc … nous de sauver les regis-
 
 
tres, et c'est ce que nous allons faire maintenant.
 
tres, et c'est ce que nous allons faire maintenant.
   
 
Note: le registre A7 contenant l'adresse du sommet de la pile
 
Note: le registre A7 contenant l'adresse du sommet de la pile
−
(cette adresse variant bien s
+
(cette adresse variant bien s�r avec l'empilage et le d�pilage),
  +
on peut consid�rer cette adresse comme un doigt indiquant perp�-
−
on peut consid‚rer cette adresse comme un doigt indiquant perp‚-
 
 
tuellement le sommet de la pile. Pour cette raison le registre A7
 
tuellement le sommet de la pile. Pour cette raison le registre A7
  +
est aussi appel� pointeur de pile. Comme toujours nous utiliserons
−
est aussi appel‚ pointeur de pile. Comme toujours nous utiliserons
 
−
le vocabulaire anglo-saxon, et nous dirons Stack Pointer, en abr
+
le vocabulaire anglo-saxon, et nous dirons Stack Pointer, en abr�-
  +
g� SP. Pour cette raison et parce que l'usage en est ainsi, nous
−
g‚ SP. Pour cette raison et parce que l'usage en est ainsi, nous
 
−
remplacerons d
+
remplacerons d�sormais A7 par SP (qui ne se lit pas "�ss-p�" mais
 
bien STACK POINTER!!!).
 
bien STACK POINTER!!!).
   
−
Imaginons que nous voulions sauvegarder D0
+
Imaginons que nous voulions sauvegarder D0 � l'entr�e de la su-
 
broutine:
 
broutine:
   
−
Il ne faudra pas oublier de le r
+
Il ne faudra pas oublier de le r�cup�rer � la
  +
sortie! D�pla�ons donc le contenu de D0 vers la pile. Essayons
−
sortie! D‚pla‡ons donc le contenu de D0 vers la pile. Essayons
 
−
MOVE.L D0,SP et r
+
MOVE.L D0,SP et r�fl�chissons: Ceci va mettre le contenu de D0
 
dans A7, malheureusement ce n'est pas ce que nous voulons faire.
 
dans A7, malheureusement ce n'est pas ce que nous voulons faire.
−
En effet nous d
+
En effet nous d�sirons mettre le contenu de D0 DANS le tube, �
−
l'endroit indiqu
+
l'endroit indiqu� par A7 (donc SP).
   
−
Ceci va se faire avec MOVE.L D0,(SP) ,les parenth
+
Ceci va se faire avec MOVE.L D0,(SP) ,les parenth�ses indiquant
−
que la source de l'op
+
que la source de l'op�ration c'est l'int�rieur du tube.
   
 
Effacez le programme actuel et tapez le suivant.
 
Effacez le programme actuel et tapez le suivant.
Line 282: Line 282:
 
MOVE.W D0,(A1)
 
MOVE.W D0,(A1)
   
−
Assemblez puis comme d'habitude d
+
Assemblez puis comme d'habitude d�buggez. D0 prend la valeur
−
$12345678, puis D0 est transf
+
$12345678, puis D0 est transf�r� dans sa totalit� (� cause du .L
−
qui indique que l'op
+
qui indique que l'op�ration se passe sur un mot long) � l'adresse
  +
qui est not�e dans A0, ensuite le poids faible de D0 est transf�r�
−
qui est not‚e dans A0, ensuite le poids faible de D0 est transf‚r‚
 
−
dans le tube
+
dans le tube � l'adresse not�e en A1. Pour le v�rifier, vous
−
pouvez activer la fen
+
pouvez activer la fen�tre 3 et demander � placer l'adresse not�e
−
dans A0 en haut de cette fen
+
dans A0 en haut de cette fen�tre, et vous constaterez qu'effecti-
 
vement la valeur de D0 se trouve bien dans le 'tube'.
 
vement la valeur de D0 se trouve bien dans le 'tube'.
   
 
Nous allons donc utiliser ce type de transfert pour sauvegarder D0
 
Nous allons donc utiliser ce type de transfert pour sauvegarder D0
   
  +
Mais r�fl�chissons encore un peu. MOVE.L D0,(SP) va bien placer
−
Mais r‚fl‚chissons encore un peu. MOVE.L D0,(SP) va bien placer
 
 
le contenu du long mot D0 dans le tube, mais si nous voulons pla-
 
le contenu du long mot D0 dans le tube, mais si nous voulons pla-
−
cer une autre valeur sur la pile, celle-ci va
+
cer une autre valeur sur la pile, celle-ci va �craser notre pre-
  +
mi�re valeur car avec MOVE.L D0,(SP) l'adresse indiqu� par SP
−
miŠre valeur car avec MOVE.L D0,(SP) l'adresse indiqu‚ par SP
 
−
(donc A7) ne va pas
+
(donc A7) ne va pas �tre modifi�e, ce qui devrait �tre le cas.
   
−
Nous allons donc r
+
Nous allons donc r�aliser le transfert diff�remment (en fait nous
−
allons encore am
+
allons encore am�liorer notre vocabulaire, puisque nous allons
 
parler maintenant de type ou de mode d'adressage).
 
parler maintenant de type ou de mode d'adressage).
   
Line 306: Line 306:
 
MOVE.L D0,-(SP)
 
MOVE.L D0,-(SP)
   
−
C'est le mode d'adressage avec pr
+
C'est le mode d'adressage avec pr�-d�cr�mentation. Derri�re ce vo-
−
cabulaire pompeux se cache toute une suite d'
+
cabulaire pompeux se cache toute une suite d'�v�nements. En une
 
seul instruction, nous diminuons l'adresse du pointeur de pile de
 
seul instruction, nous diminuons l'adresse du pointeur de pile de
−
4 (puisque dans notre exemple nous voulions transf
+
4 (puisque dans notre exemple nous voulions transf�rer un long mot
−
donc 4 octets), et nous pla
+
donc 4 octets), et nous pla�ons en m�moire � cette adresse le long
 
mot D0.
 
mot D0.
   
  +
Pour r�cup�rer D0, c'est-�-dire d�piler, il faudra faire:
−
Pour r‚cup‚rer D0, c'est-…-dire d‚piler, il faudra faire:
 
   
 
MOVE.L D0,(SP)+
 
MOVE.L D0,(SP)+
   
−
Comme nous avions d
+
Comme nous avions d�cr�ment� le pointeur de pile pour ensuite d�-
  +
poser D0 � cette adresse, nous r�cup�rons donc D0 sans oublier en-
−
poser D0 … cette adresse, nous r‚cup‚rons donc D0 sans oublier en-
 
 
suite de modifier le pointeur de pile dans l'autre sens, pour
 
suite de modifier le pointeur de pile dans l'autre sens, pour
−
qu'il retrouve son ancienne position. Notons que dans le cas pr
+
qu'il retrouve son ancienne position. Notons que dans le cas pr�-
−
sent, et si nous nous contentons de r
+
sent, et si nous nous contentons de r�fl�chir tr�s sommairement,
  +
il aurait �t� possible de sauver D0 par MOVE.L D0,(SP) et de le
−
il aurait ‚t‚ possible de sauver D0 par MOVE.L D0,(SP) et de le
 
  +
r�cup�rer par MOVE.L (SP),D0. C'est compter sans le fait que la
−
r‚cup‚rer par MOVE.L (SP),D0. C'est compter sans le fait que la
 
−
pile est un r
+
pile est un r�servoir commun � beaucoup de choses. Il faut donc de
  +
pr�f�rence jouer � chaque fois le jeu d'un empilage correct et r�-
−
pr‚f‚rence jouer … chaque fois le jeu d'un empilage correct et r‚-
 
  +
fl�chi mais aussi d'un d�pilage 'collant' parfaitement avec l'em-
−
fl‚chi mais aussi d'un d‚pilage 'collant' parfaitement avec l'em-
 
−
pilage pr
+
pilage pr�c�dent.
   
  +
V�rifions tout cela avec l'exemple suivant:
−
V‚rifions tout cela avec l'exemple suivant:
 
 
MOVE.L #$12345678,D0 valeur dans D0
 
MOVE.L #$12345678,D0 valeur dans D0
 
MOVE.W #$AAAA,D1 valeur dans D1
 
MOVE.W #$AAAA,D1 valeur dans D1
 
MOVE.L D0,-(SP) sauve D0.L sur la pile
 
MOVE.L D0,-(SP) sauve D0.L sur la pile
 
MOVE.W D1,-(SP) idem D1 mais en word
 
MOVE.W D1,-(SP) idem D1 mais en word
−
MOVE.L #0,D0 remet D0
+
MOVE.L #0,D0 remet D0 � 0
 
MOVE.W #0,D1 et D1 aussi
 
MOVE.W #0,D1 et D1 aussi
−
MOVE.W D1,(SP)+ r
+
MOVE.W D1,(SP)+ r�cup�re D1 (word)
 
MOVE.L D0,-(SP) puis D0
 
MOVE.L D0,-(SP) puis D0
   
−
Assemblez puis faites d
+
Assemblez puis faites d�filer ce programme pas � pas sous MONST.
−
Notez plusieurs choses: tout d'abord des commentaires ont
+
Notez plusieurs choses: tout d'abord des commentaires ont �t�
  +
ajout�s au source. Il suffit que ceux-ci soient s�par�s des op�-
−
ajout‚s au source. Il suffit que ceux-ci soient s‚par‚s des op‚-
 
 
randes pour que l'assembleur sache qu'il s'agit de commentaires.
 
randes pour que l'assembleur sache qu'il s'agit de commentaires.
  +
Si vous d�sirez taper une ligne de commentaires (c'est-�-dire que
−
Si vous d‚sirez taper une ligne de commentaires (c'est-…-dire que
 
 
sur celle-ci il n'y aura rien d'autre que ce commentaire), vous
 
sur celle-ci il n'y aura rien d'autre que ce commentaire), vous
−
devez le faire pr
+
devez le faire pr�c�der du caract�re �toile ou d'un point virgule.
   
−
Seconde chose, nous avions empil
+
Seconde chose, nous avions empil� D0 puis D1, ensuite nous avons
  +
d�pil� D1 puis D0. Il faut en effet bien faire attention � l'ordre
−
d‚pil‚ D1 puis D0. Il faut en effet bien faire attention … l'ordre
 
−
et aux tailles de ce que nous empilons, afin de pouvoir d
+
et aux tailles de ce que nous empilons, afin de pouvoir d�piler
  +
les m�mes tailles, dans l'ordre inverse de l'empilage.
−
les mˆmes tailles, dans l'ordre inverse de l'empilage.
 
   
 
Voici un dernier exemple.
 
Voici un dernier exemple.
Line 364: Line 364:
 
RTS
 
RTS
   
−
Assemblez puis suivez le d
+
Assemblez puis suivez le d�roulement sous MONST en �tudiant bien
  +
le d�roulement. Vous voyez bien que le BSR sauve l'adresse de re-
−
le d‚roulement. Vous voyez bien que le BSR sauve l'adresse de re-
 
−
tour sur la pile, puis que D0 et mis par dessus pour
+
tour sur la pile, puis que D0 et mis par dessus pour �tre ensuite
  +
r�cup�r�. Ensuite c'est l'adresse de retour qui est reprise et le
−
r‚cup‚r‚. Ensuite c'est l'adresse de retour qui est reprise et le
 
 
programme remonte.
 
programme remonte.
   
 
Maintenant, provoquons une erreur, une toute petite erreur mais
 
Maintenant, provoquons une erreur, une toute petite erreur mais
−
qui sera fatale
+
qui sera fatale � notre programme. Au lieu de r�cup�rer D0 par un
−
MOVE.L (SP)+,D0, commettons une faute de frappe et tapons
+
MOVE.L (SP)+,D0, commettons une faute de frappe et tapons � la
 
place MOVE.W (SP)+,D0.
 
place MOVE.W (SP)+,D0.
   
−
Assemblez et suivez pas
+
Assemblez et suivez pas � pas. Au moment de la sauvegarde de D0,
−
ce sont bien 4 octets qui vont
+
ce sont bien 4 octets qui vont �tre plac�s sur la pile, modifiant
−
celle-ci d'autant. Malheureusement la r
+
celle-ci d'autant. Malheureusement la r�cup�ration ne va re-mo-
−
difier cette pile que de 2 octets. Au moment o
+
difier cette pile que de 2 octets. Au moment o� l'instruction RTS
−
va essayer de r
+
va essayer de r�cup�rer l'adresse de retour, le pointeur de pile
−
sera faux de 2 octets par rapport
+
sera faux de 2 octets par rapport � l'endroit o� se trouve r�elle-
−
ment cette adresse de retour, et celui-ci va se faire
+
ment cette adresse de retour, et celui-ci va se faire � une
 
adresse fausse. En conclusion: prudence et rigueur!!!!!!
 
adresse fausse. En conclusion: prudence et rigueur!!!!!!
   
−
Nous venons donc de voir que la pile
+
Nous venons donc de voir que la pile �tait utilis�e par le 68000
−
pour certaines instructions, et qu'elle
+
pour certaines instructions, et qu'elle �tait bien commode comme
 
sauvegarde.
 
sauvegarde.
   
−
Il est aussi possible de l'utiliser pour transmettre des donn
+
Il est aussi possible de l'utiliser pour transmettre des donn�es,
 
c'est ce que nous allons voir pour conclure ce chapitre.
 
c'est ce que nous allons voir pour conclure ce chapitre.
   
  +
Probl�me: Notre programme principal utilise les registres A0 � A6
−
ProblŠme: Notre programme principal utilise les registres A0 … A6
 
  +
et D0 � D6. Il va appeler une subroutine destin�e � additionner 2
−
et D0 … D6. Il va appeler une subroutine destin‚e … additionner 2
 
−
nombres et
+
nombres et � retourner le r�sultat dans D7. Il faudra donc utili-
 
ser 2 registres par exemple D0 et D1 pour travailler dans notre
 
ser 2 registres par exemple D0 et D1 pour travailler dans notre
−
routine, et donc les sauvegarder
+
routine, et donc les sauvegarder � l'entr�e de celle-ci.
   
−
Voici le d
+
Voici le d�but du programme.
   
 
MOVE.L #$11111111,D0
 
MOVE.L #$11111111,D0
Line 408: Line 408:
   
 
Les 7 premiers registres sont remplis avec des valeurs bidons,
 
Les 7 premiers registres sont remplis avec des valeurs bidons,
−
juste pour nous permettre de v
+
juste pour nous permettre de v�rifier leurs �ventuelles modifica-
 
tions.
 
tions.
   
−
Maintenant il faut placer les 2 nombres que nous d
+
Maintenant il faut placer les 2 nombres que nous d�sirions addi-
−
tionner, dans un endroit tel qu'ils pourront
+
tionner, dans un endroit tel qu'ils pourront �tre r�cup�r�s par la
−
routine d'addition. Pla
+
routine d'addition. Pla�ons donc ces 2 nombres sur la pile.
   
 
MOVE.L #$12345678,-(SP)
 
MOVE.L #$12345678,-(SP)
Line 419: Line 419:
 
BSR AJOUTE et en route !
 
BSR AJOUTE et en route !
   
  +
R�digeons maintenant notre subroutine, afin de suivre l'ordre de
−
R‚digeons maintenant notre subroutine, afin de suivre l'ordre de
 
 
travail du 68000.
 
travail du 68000.
   
 
De quoi aurons nous besoin dans cette routine ?
 
De quoi aurons nous besoin dans cette routine ?
   
−
De D0 et de D1 qui vont recevoir les nombres empil
+
De D0 et de D1 qui vont recevoir les nombres empil�s et qui
−
vont nous servir au calcul. Il va nous falloir
+
vont nous servir au calcul. Il va nous falloir �galement un regis-
−
tre d'adresse. En effet, lorsque nous allons d
+
tre d'adresse. En effet, lorsque nous allons d�piler nous allons
 
modifier le pointeur de pile, or nous venons d'effectuer un BSR le
 
modifier le pointeur de pile, or nous venons d'effectuer un BSR le
−
68000 a donc empil
+
68000 a donc empil� l'adresse de retour sur la pile, et modifier
 
celle-ci va compromettre le retour! Nous allons donc copier
 
celle-ci va compromettre le retour! Nous allons donc copier
 
l'adresse de la pile dans A0, et utiliser cette copie.
 
l'adresse de la pile dans A0, et utiliser cette copie.
   
−
Note: j'ai d
+
Note: j'ai d�cid� d'utiliser D0, D1 et A0 mais n'importe quel au-
 
tre registre aurait tout aussi bien convenu.
 
tre registre aurait tout aussi bien convenu.
   
  +
Commen�ons donc par sauver nos 3 registres.
−
Commen‡ons donc par sauver nos 3 registres.
 
   
 
Cela pourrait se faire par:
 
Cela pourrait se faire par:
Line 445: Line 445:
 
Note: je rappelle que cela se lit move long!
 
Note: je rappelle que cela se lit move long!
   
−
Mais le 68000 poss
+
Mais le 68000 poss�de une instruction tr�s utile dans un pareil
−
cas, qui permet de transf
+
cas, qui permet de transf�rer plusieurs registres d'un coup.
   
 
Nous allons donc faire:
 
Nous allons donc faire:
Line 454: Line 454:
 
Ce qui se lit: move multiple registers.
 
Ce qui se lit: move multiple registers.
   
−
Si nous devions transf
+
Si nous devions transf�rer de D0 � D5 nous aurions fait :
   
 
MOVEM.L D0-D5,-(SP)
 
MOVEM.L D0-D5,-(SP)
   
−
et, pour transf
+
et, pour transf�rer tous les registres d'un seul coup:
   
 
MOVEM.L D0-D7/a0-A6,-(SP) Compris?
 
MOVEM.L D0-D7/a0-A6,-(SP) Compris?
Line 467: Line 467:
 
MOVE.L A7,A0 transfert du registre A7 vers A0
 
MOVE.L A7,A0 transfert du registre A7 vers A0
   
−
Maintenant nous allons r
+
Maintenant nous allons r�cup�rer les 2 nombres que nous avions em-
  +
pil� avant l'instruction BSR.
−
pil‚ avant l'instruction BSR.
 
   
−
Imaginons ce qui s'est pass
+
Imaginons ce qui s'est pass�. (A ce propos je vous conseille TRES
−
fortement de vous aider d'un papier et d'un crayon. N'h
+
fortement de vous aider d'un papier et d'un crayon. N'h�sitez pas
  +
� �crire sur ces cours. Ce sont les v�tres et je ne les r�clamerai
−
… ‚crire sur ces cours. Ce sont les v“tres et je ne les r‚clamerai
 
 
pas!
 
pas!
   
−
Faire un petit dessin ou de placer des pi
+
Faire un petit dessin ou de placer des pi�ces sur votre bureau
−
pour vous aider
+
pour vous aider � comprendre est une excellente chose. Bien sou-
−
vent les manipulations de m
+
vent les manipulations de m�moire ont tendance � devenir abstrai-
 
tes et un petit dessin arrange bien des choses!)
 
tes et un petit dessin arrange bien des choses!)
   
−
Nous avons d
+
Nous avons d�cal� de 4 octets le STACK POINTER, puis nous y avons
  +
d�pos� $12345678. Mais dans quel sens avons nous d�cal� ce SP ?
−
d‚pos‚ $12345678. Mais dans quel sens avons nous d‚cal‚ ce SP ?
 
   
  +
Vers le d�but de la m�moire, vers l'adresse 0 de notre tube puis-
−
Vers le d‚but de la m‚moire, vers l'adresse 0 de notre tube puis-
 
 
que nous avons fait -(SP). Le pointeur de pile remonte donc le
 
que nous avons fait -(SP). Le pointeur de pile remonte donc le
−
long du tube. Nous avons ensuite recommenc
+
long du tube. Nous avons ensuite recommenc� la m�me chose pour y
  +
d�poser $23456. Ensuite BSR, donc m�me chose mais r�alis� automa-
−
d‚poser $23456. Ensuite BSR, donc mˆme chose mais r‚alis‚ automa-
 
−
tiquement par le 68000 afin d'y d
+
tiquement par le 68000 afin d'y d�poser l'adresse de retour (4 oc-
 
tets).
 
tets).
   
 
Est-ce tout? Non car une fois rendu dans la subroutine nous avons
 
Est-ce tout? Non car une fois rendu dans la subroutine nous avons
  +
d�pos� sur la pile les registres D0, D1 et A0. Le transfert ayant
−
d‚pos‚ sur la pile les registres D0, D1 et A0. Le transfert ayant
 
  +
�t� effectu� sur le format long mot (MOVEM.L) nous avons transf�r�
−
‚t‚ effectu‚ sur le format long mot (MOVEM.L) nous avons transf‚r‚
 
 
3 fois 4 octets soit 12 octets (bytes).
 
3 fois 4 octets soit 12 octets (bytes).
   
 
Notre copie de A7 qui est en A0 ne pointe donc pas sur nos 2 nom-
 
Notre copie de A7 qui est en A0 ne pointe donc pas sur nos 2 nom-
−
bres mais beaucoup plus loin. Le nombre que nous avons plac
+
bres mais beaucoup plus loin. Le nombre que nous avons plac� en
−
second sur la pile est donc
+
second sur la pile est donc � 16 vers le d�but du tube (faites le
 
calcul: 1BSR, + 12 bytes de sauvegarde cela fait bien 16 bytes) et
 
calcul: 1BSR, + 12 bytes de sauvegarde cela fait bien 16 bytes) et
−
le nombre plac
+
le nombre plac� en premier sur la pile suit son copain et se
−
trouve donc
+
trouve donc � 20 bytes d'ici, en vertu toujours du principe de la
−
pile: le dernier entr
+
pile: le dernier entr�, c'est le premier sorti.
   
−
Nous pouvons donc dire que $23456 est
+
Nous pouvons donc dire que $23456 est � A0 d�cal� de 16 et que
−
$12345678 est
+
$12345678 est � A0 d�cal� de 20.
   
  +
Pour r�cup�rer ces 2 nombres plusieurs actions sont possibles:
−
Pour r‚cup‚rer ces 2 nombres plusieurs actions sont possibles:
 
   
−
1) ajouter 16
+
1) ajouter 16 � l'adresse de A0 puis r�cup�rer.
   
 
Une addition d'adresse se fait par ADDA (add adress).
 
Une addition d'adresse se fait par ADDA (add adress).
Line 515: Line 515:
 
ADDA.L #16,A0
 
ADDA.L #16,A0
   
−
A0 pointe donc maintenant sur $23456, r
+
A0 pointe donc maintenant sur $23456, r�cup�rons donc ce nombre et
−
profitons du mode d'adressage pour avancer l'adresse indiqu
+
profitons du mode d'adressage pour avancer l'adresse indiqu�e dans
−
A0 et ainsi tout de suite
+
A0 et ainsi tout de suite �tre pr�t pour r�cup�rer l'autre nombre.
 
MOVE.L A0)+,D0
 
MOVE.L A0)+,D0
−
L'adresse ayant
+
L'adresse ayant �t� augment�e nous pouvons donc r�cup�rer la
 
suite:
 
suite:
 
MOVE.L (A0)+,D1
 
MOVE.L (A0)+,D1
   
−
2) Autre m
+
2) Autre m�thode, utilisant un autre mode d'adressage:
   
  +
La m�thode pr�c�dente pr�sente un inconv�nient: apr�s le ADDA, A0
−
La m‚thode pr‚c‚dente pr‚sente un inconv‚nient: aprŠs le ADDA, A0
 
  +
est modifi� et si nous voulions garder cette adresse, il aurait
−
est modifi‚ et si nous voulions garder cette adresse, il aurait
 
 
fallu le sauvegarder.
 
fallu le sauvegarder.
   
−
Ou bien nous aurions pu ajouter le d
+
Ou bien nous aurions pu ajouter le d�calage � A0, r�cup�rer les
  +
donn�es et ensuite retirer le d�calage � A0 pour qu'il retrouve
−
donn‚es et ensuite retirer le d‚calage … A0 pour qu'il retrouve
 
−
sont
+
sont �tat de d�part.
   
  +
Autre m�thode donc, indiquer dans l'adressage le d�calage � appli-
−
Autre m‚thode donc, indiquer dans l'adressage le d‚calage … appli-
 
 
quer. Cela se fait par:
 
quer. Cela se fait par:
   
Line 539: Line 539:
 
MOVE.L 20(A0),D1
 
MOVE.L 20(A0),D1
   
−
Cela permet de pointer sur le 16
+
Cela permet de pointer sur le 16�me octet � partir de l'adresse
  +
donn�e par A0 et ensuite de pointer sur le 20�me par rapport � A0.
−
donn‚e par A0 et ensuite de pointer sur le 20Šme par rapport … A0.
 
−
Dans les 2 cas, A0 n'est pas modifi
+
Dans les 2 cas, A0 n'est pas modifi�.
   
  +
Voil� le listing complet de cet exemple.
−
Voil… le listing complet de cet exemple.
 
   
 
MOVE.L #$11111111,D0 initialisation de D0
 
MOVE.L #$11111111,D0 initialisation de D0
Line 555: Line 555:
 
MOVE.L #$00023456,-(SP) passage nombre 2 dans la pile
 
MOVE.L #$00023456,-(SP) passage nombre 2 dans la pile
 
BSR AJOUTE et en route !
 
BSR AJOUTE et en route !
−
MOVE.L D7,D0 transfert du r
+
MOVE.L D7,D0 transfert du r�sultat pour voir..
   
   
Line 561: Line 561:
 
AJOUTE MOVEM.L D0-D1/A0,-(SP) sauvegarde
 
AJOUTE MOVEM.L D0-D1/A0,-(SP) sauvegarde
 
MOVE.L A7,A0 copie de SP en A0
 
MOVE.L A7,A0 copie de SP en A0
−
MOVE.L 16(A0),D0 r
+
MOVE.L 16(A0),D0 r�cup�re 23456 et le met en D0
−
MOVE.L 20(A0),D1 r
+
MOVE.L 20(A0),D1 r�cup�re 12345678 en D1
 
ADD.L D0,D1 addition
 
ADD.L D0,D1 addition
−
MOVE.L D1,D7 transfert du r
+
MOVE.L D1,D7 transfert du r�sultat
−
MOVEM.L (SP)+,D0-D1/A0 r
+
MOVEM.L (SP)+,D0-D1/A0 r�cup�ration
 
RTS et retour
 
RTS et retour
   
 
* Note: ce programme n'ayant pas de fin 'normale',
 
* Note: ce programme n'ayant pas de fin 'normale',
 
lorsque vous* serez rendu au retour de la subroutine
 
lorsque vous* serez rendu au retour de la subroutine
−
c'est-
+
c'est-�-dire apr�s la ligne" MOVE.L D7,D0 ", quittez
 
le avec Control+C, Assemblez et suivez bien TOUT le
 
le avec Control+C, Assemblez et suivez bien TOUT le
−
d
+
d�roulement.
   
  +
Bien s�r, il aurait �t� possible de faire cela tout diff�remment.
−
Bien s–r, il aurait ‚t‚ possible de faire cela tout diff‚remment.
 
−
Par exemple nous aurions pu
+
Par exemple nous aurions pu �viter de travailler avec A0. En effet
−
16(A0) et 20(A0) ne modifiant pas A0, il aurait
+
16(A0) et 20(A0) ne modifiant pas A0, il aurait �t� plus simple de
 
faire 16(A7) et 20(A7) au lieu de recopier d'abord A7 en A0. De
 
faire 16(A7) et 20(A7) au lieu de recopier d'abord A7 en A0. De
  +
m�me il aurait �t� possible de transf�rer $23456 directement en D7
−
mˆme il aurait ‚t‚ possible de transf‚rer $23456 directement en D7
 
−
et $12345678 en D1 puis de faire ADD.L D1,D7 afin d'
+
et $12345678 en D1 puis de faire ADD.L D1,D7 afin d'�viter la
−
sauvegarde de D0 (qui aurait
+
sauvegarde de D0 (qui aurait �t� inutilis�e), et le transfert D1
−
vers D7 qui n'aurait alors pas eu lieu d'
+
vers D7 qui n'aurait alors pas eu lieu d'�tre. De m�me nous au-
−
rions pu retourner le r
+
rions pu retourner le r�sultat par la pile au lieu de le faire par
 
D7.
 
D7.
   
Line 589: Line 589:
 
Pour terminer, un petit exercice. Relancer ce petit programme et
 
Pour terminer, un petit exercice. Relancer ce petit programme et
 
analysez PARFAITEMENT TOUT ce qui s'y passe. Quelque chose ne va
 
analysez PARFAITEMENT TOUT ce qui s'y passe. Quelque chose ne va
−
pas ! Je vous aide en disant qu'il s'agit bien s
+
pas ! Je vous aide en disant qu'il s'agit bien s�r de la pile.
−
Cherchez et essayez de trouver comment faire pour arranger
+
Cherchez et essayez de trouver comment faire pour arranger �a.
   
  +
La r�ponse sera au d�but du prochain cours mais essayez d'imaginer
−
La r‚ponse sera au d‚but du prochain cours mais essayez d'imaginer
 
 
que c'est votre programme et qu'il ne marche pas et cherchez!!!
 
que c'est votre programme et qu'il ne marche pas et cherchez!!!
   
 
Bon, le cours sur la pile se termine ici. Ce fut un peu long mais
 
Bon, le cours sur la pile se termine ici. Ce fut un peu long mais
−
je pense, pas trop compliqu
+
je pense, pas trop compliqu�. Relisez le, car la pile est un truc
  +
d�licat dont nous allons nous servir TRES abondamment dans le pro-
−
d‚licat dont nous allons nous servir TRES abondamment dans le pro-
 
−
chain cours. Si vous avez
+
chain cours. Si vous avez � peu pr�s tout compris jusqu'ici il est
 
encore temps de rattraper le temps perdu et de tout reprendre au
 
encore temps de rattraper le temps perdu et de tout reprendre au
  +
d�but, car il faut avoir PARFAITEMENT tout compris et pas � peu
−
d‚but, car il faut avoir PARFAITEMENT tout compris et pas … peu
 
−
pr
+
pr�s!
   
−
Afin de vous remonter le moral, je vous signal que vous
+
Afin de vous remonter le moral, je vous signal que vous �tes pres-
−
que
+
que � la moiti� du cours...
 
</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 6                         *
   *                                                                *
   ******************************************************************

   LA  PILE    Nous  avons d�j� utilis� la notion de 'tube' en ce qui
   concerne la m�moire. Nous pouvons y stocker diff�rentes choses, et
   si nous nous rappelons l'adresse, nous pouvons revenir plus tard �
   cet endroit pour y r�cup�rer ce que nous y avions d�pos�.

   Essayez avec ce petit programme:

          MOVE.L     #$12345678,D0
          MOVE.L     D0,$493E0
          MOVE.L     #0,D0
          MOVE.L     $493E0,D0

   Assemblez  puis  passez  sous  MONST. Avancez en pas � pas. D0 est
   d'abord rempli avec $12345678, puis le contenu de D0 est transf�r�
   � l'adresse $493E0. Notez bien qu'il n'y a pas de # devant $493E0,
   afin d'indiquer qu'il s'agit bien d'une adresse. Cette ligne �tant
   ex�cut�e, activez  la fen�tre 3 ([Alternate+3]) et placez le d�but
   de  celle-ci sur l'adresse $493E0 ([Alternate+A] puis tapez 493E0)
   Vous  voyez  bien  12345678 �  cet endroit dans le 'tube'. Si j'ai
   choisit  cette  adresse c'est parce qu'elle se situe � 300 Kilo du
   d�but  de la m�moire. Elle est donc accessible m�me sur un 520, et
   elle  est  suffisamment �loign�e pour ne pas se trouver dans GENST
   ou MONST. En effet il n'y a qu'un 'tube' m�moire! Nous sommes donc
   en  train d'�crire dans la m�moire alors qu'une partie de celle-ci
   est occup�e par GENST et MONST! Ecrire � l'int�rieur des zones oc-
   cup�es  par  ces  programmes  est possible, ce qui entra�nera tr�s
   certainement quelques plantages de ceux-ci!

   Continuons  en  pas  � pas, nous mettons D0 � 0 puis le contenu de
   l'adresse $493E0 (sans #) est remis dans D0.

   La  pile, c'est  une partie de ce tube, mais que nous allons g�rer
   d'une  mani�re  un peu diff�rente. En effet, au lieu de placer les
   donn�es dans le tube et de noter leurs adresses, nous allons cette
   fois-ci les empiler et pour les r�cup�rer, les d�piler. L'avantage
   c'est  le  gain  de  temps  (pas  la peine de se demander � quelle
   adresse  on  a  stock�  les donn�es) et un gain de place (si c'est
   pour  stocker temporairement des donn�es, inutile de conserver une
   portion de 'tube' juste pour �a).

   Par  contre  l'inconv�nient  c'est que la gestion doit �tre rigou-
   reuse. Imaginons  que  j'empile  un premier chiffre puis 10 autres
   par  dessus. Ensuite  je  d�pile, mais  erreur  de  ma part, je ne
   d�pile  que  9 chiffres! Quand  je  d�pilerai  une  fois  de plus,
   croyant  retrouver  le  premier  chiffre empil�, je r�cup�rerai en
   fait le premier de la s�rie de 10.

   Nous  en concluons 2 choses: d'abord que la pile est un moyen sim-
   ple  pour  sauvegarder  des  donn�es, mais  ensuite  que c'est une
   source de d�sagr�ment potentiel, tel que certains programmeurs h�-
   site  � s'en servir. C'est g�n�ralement � cause d'un manque de ri-
   gueur ce qui, je l'esp�re ne vous arrivera pas.

   Une autre remarque: le dernier �l�ment plac� sur la pile sera tou-
   jours  le premier � en sortir. C'est bien le m�me principe que ce-
   lui  d'une  pile  d'assiettes: Regardez chez vous, il y a s�rement
   une �norme pile d'assiettes, mais par le simple fait que le range-
   ment  apr�s  le lavage se fait par empilage et que mettre la table
   se  fait par d�pilage, vous mangez en fait toujours dans les m�mes
   assiettes... (d'o� l'int�r�t de bien faire la vaisselle!)

   Cette  structure  de pile est appel�e structure LIFO, c'est-�-dire
   Last In  First Out, en  Fran�ais:  'dernier entr�  premier sorti'.
   Cette  structure  est diff�rente d'une autre structure fr�quemment
   rencontr�e en informatique, celle de la file, appel�e aussi struc-
   ture  FIFO  (First In  First Out), la  file  �tant similaire � une
   file  d'attente devant un guichet: le premier dans la file sera le
   premier parti.

   Mais  concr�tement, �  quoi sert la pile? Nous allons le voir avec
   un exemple. Tapez le programme suivant:



          MOVE.L     #$12345678,D0
          MOVE.L     #$BD88,D1
          MOVE.L     #$BD88,A0
          BSR        AJOUTE
          MOVE.L     #0,D0
          MOVE.L     D2,D0


AJOUTE    MOVE.L     #$11112222,D2
          ADD.L      D1,D2
          RTS

   Premi�re remarque: ce programme diff�re des pr�c�dents par le fait
   que nous utilisons une �tiquette, un label qui se nomme AJOUTE.

   Ce mot, 'AJOUTE', doit se trouver tout � gauche, contre le bord de
   la  fen�tre de l'�diteur. Ce n'est pas quelque chose � placer DANS
   le tube mais bien une marque A COTE du tube.

   Autre remarque, les listings en assembleur, contrairement aux lis-
   tings dans les autres langages sont assez libres au niveau pr�sen-
   tation. Il  est  tout a fait possible de passer des lignes, ce qui
   est  fait  ici  pour s�parer les 2 parties. Les sources assembleur
   sont bien souvent tr�s longs, et m�me si cela fait perdre quelques
   lignes, espacer  les  modules  permet  de s'y retrouver plus faci-
   lement.

   Assemblons  puis d�buggons. Avan�ons pas � pas avec Control+Z. Les
   3 premi�res  lignes  nous  sont  famili�res mais pas la quatri�me.
   Celle-ci  se  lit BRANCH SUB ROUTINE AJOUTE, c'est-�-dire branche-
   ment � une subroutine nomm�e AJOUTE. Pour pr�ciser vers quelle su-
   broutine  on d�sire se diriger, son �tiquette est pr�cis�e. Ici en
   l'occurrence  c'est  AJOUTE mais le nom importe peu. Il est tout a
   fait  possible  de  mettre  des noms assez longs et je ne peux que
   vous  conseiller d'�viter dans vos listings les noms du genre X Y,
   Z  ou  encore  AX1 etc... qui sont quand m�me moins explicites que
   DEBUT_IMAGE, NEW_PALETTE ou bien END_GAME.

   Maintenant soyez tr�s attentifs: � la lecture de cette instruction
   de nombreuses choses vont se passer. L'ordre demande donc au 68000
   de  poursuivre  la  lecture  de  ses  instructions  dans  un  sous
   programme  dont  le d�but se situe dans le tube, en face de l'�ti-
   quette  AJOUTE. Cependant  il s'agit bien ici d'un sous-programme.
   Ceci suppose qu'une fois termin�, le 68000 remontera pour ex�cuter
   la ligne qui suit BSR AJOUTE, en l'occurrence  MOVE.L #0,D0. Ques-
   tion: comment  le 68000 saura-t-il o� remonter? En effet le propre
   d'une  subroutine est de pouvoir �tre appel�e plusieurs fois et de
   plusieurs  endroits diff�rents et de pouvoir � chaque fois revenir
   � l'endroit m�me qui l'a appel�.

   Eh  bien le 68000 va justement utiliser la pile pour noter ce lieu
   de  retour. Cette pile a bien sur une adresse, o� se trouve-t-elle
   not�e? En  A7. Et  oui, ce registre un peu sp�cial correspond � la
   pile.

   Mais  A7' alors?  Et  bien  c'est aussi une pile, mais r�serv�e au
   mode  Superviseur. Ainsi  si nous faisions tourner conjointement 2
   programmes, l'un  en  mode  utilisateur et l'autre en superviseur,
   chacun aurait sa pile.

   Avant  d'ex�cuter la ligne BSR AJOUTE, observons attentivement les
   registres d'adresses et les registres de donn�es.

   Nous  avons  vu  que  les  registres, qu'ils  soient de donn�es ou
   d'adresse, peuvent  contenir  des  nombres cod�s sur 32 bits. Nous
   avons vu aussi qu'il existait 2 sortes de nombres pour la machine:
   ceux  se  trouvant  �  l'int�rieur du 'tube' et ceux ce trouvant �
   l'ext�rieur, CONTRE  ce  tube, et  indiquant une sorte de distance
   par rapport au d�but de celui-ci.

   Ce second type de nombre est appel� adresse. Or il est tout � fait
   possible  de  stocker  un  nombre repr�sentant une adresse dans un
   registre de donn�es (D0-D7). Imaginons maintenant que nous devions
   stocker  le score d'un joueur dans le jeu que nous programmons. Ce
   score va par exemple �tre plac� dans la m�moire (dans le 'tube') �
   l'adresse $80792.

   Mais  que  se  passera-t-il si nous transf�rons cette adresse pour
   l'utiliser gr�ce � A1 par exemple? et bien A1 va prendre la valeur
   $80792. C'est  bien joli, mais ce qui nous int�resse, ce n'est pas
   �a! Ce  que nous voulons modifier, v�rifier etc.. c'est ce qu'il y
   a DANS le tube � cette adresse.

   Et  bien  notre  d�bugger anticipe un peu cette demande. En effet,
   partant du principe que les nombres stock�s en D0-D7 ou A0-A6 peu-
   vent repr�senter des valeurs d'adresses, il indique � c�t� des re-
   gistres, ce  qu'il  y a dans le tube, � l'adresse indiqu�e dans le
   registre.

   En  ce qui concerne les registres de donn�es, MONST affiche � leur
   droite  la valeur de 8 octets se trouvant dans le tube � l'adresse
   indiqu�e  dans  le registre. Pour les registres d'adresse, ce sont
   10 octets  qui  sont  indiqu�s. Vous  remarquez certainement qu'en
   face du registre D0 (qui doit contenir $12345678 si vous avez fait
   correctement  avancer  le  programme), MONST  n'a  affich� que des
   �toiles. C'est  normal car le nombre $12345678 correspond � un em-
   placement  m�moire  qui  se  serait accessible qu'avec 305 m�ga de
   m�moire!!! MONST  indique  donc  qu'il ne peut pas atteindre cette
   zone m�moire en affichant des �toiles.

   Regardons  maintenant  D1 et  A0. Les nombres situ�s � leur droite
   montrent  la m�me chose, ce qui est normal puisque les 2 registres
   D1 et  A0 sont remplis avec le m�me nombre. On dit qu'ils pointent
   sur  l'adresse  $BD88. Allons voir en m�moire histoire de v�rifier
   l'affichage. Activez  la fen�tre 3 avec Alternate+3. Celle-ci nous
   affiche le contenu de la m�moire, mais nous sommes loin de $BD88!

   Demandons  donc que cette adresse soit celle du haut de la fen�tre
   3, avec Alternate+A. Tapons cette adresse (BD88). La fen�tre 3  se
   r� affiche avec en haut l'adresse $BD88. Dans la colonne de droite
   nous  voyons  le  contenu  de la m�moire, dont nous avions d�j� un
   aper�u avec l'affichage � droite de D1 et de A0. C'est clair?

   R�activons  la fen�tre 1 (alternate+1). Normalement la petite fl�-
   che  doit  toujours  se  trouvez  en  face du BSR AJOUTE. Noter le
   chiffre  se  trouvant  dans  le  registre A7 (donc l'adresse de la
   pile) et  observer bien les chiffres � droite de ce registre, tout
   en faisant Control+Z.

   Les  chiffres  ont chang�! D'abord le registre A7 ne contient plus
   le  m�me  nombre. Celui  qui  s'y trouve actuellement est en effet
   plus petit que le pr�c�dent. Notons que cette diff�rence est de 4.
   L'adresse  de  la  pile  a  donc �t� d�cr�ment�e de 4. De plus des
   chiffres  ont  �t�  plac�s  dans  la pile (on les voit � droite du
   registre  A7). Or, regardez  bien  le  nombre  qui est � gauche de
   l'instruction   MOVE.L  #0,D0  de  notre  programme,  c'est-�-dire
   l'adresse � laquelle devra revenir le 68000 une fois la subroutine
   termin�e: c'est  bien ce nombre qui a �t� plac� dans la pile. Il y
   a  donc empilage de l'adresse de retour, ce qui explique �galement
   le  changement d'adresse de la pile de 4. En effet une adresse est
   cod�e sur 4 octets !

   Note: �tant  donn�  que  nous parlons de pile, on dit plus souvent
   que  les  donn�es  sont mises sur la pile et moins souvent dans la
   pile.

   Continuons  notre programme avec Control+Z. Nous sommes maintenant
   dans  la  sous-routine. Arr�tez  juste avant RTS. C'est cette ins-
   truction qui va nous faire "remonter". Elle se lit RETURN FROM SUB
   ROUTINE.

   Observons  A7 (sa  valeur  mais aussi le contenu du 'tube' � cette
   adresse) et faisons un pas (Control+Z). L'adresse de retour a �t�
   d�pil�e, A7 a repris son ancienne adresse et nous pointons mainte-
   nant sur MOVE.L  #0,D0.

   Quittez ce programme avec Control+C, effacez le et tapez celui-ci.

          MOVE.L     #$12345678,D0
          MOVE.L     #$AAAAAAAA,D1
          BSR        AJOUTE
          MOVE.W     D2,D3

AJOUTE    MOVE.W     #$EEEE,D1
          MOVE.W     #$1111,D2
          ADD.W      D1,D2
          RTS

   Assemblez  puis  d�buggez. Avancez  pas  � pas: D0 prend la valeur
   $12345678 D1 la valeur AAAAAAAA, puis nous partons vers la subrou-
   tine AJOUTE.

   Malheureusement  celle-ci  utilise D1 et au retour nous constatons
   que  celui-ci ne contient plus AAAAAAAA. En effet le branchement �
   une  subroutine  ne sauve rien d'autre que l'adresse de retour, et
   en assembleur les variables locales et autres bidouilles de langa-
   ges �volu�s n'existent pas! C'est donc � nous de sauver les regis-
   tres, et c'est ce que nous allons faire maintenant.

   Note: le  registre  A7 contenant  l'adresse  du  sommet de la pile
   (cette  adresse  variant bien s�r avec l'empilage et le d�pilage),
   on  peut  consid�rer cette adresse comme un doigt indiquant perp�-
   tuellement  le sommet de la pile. Pour cette raison le registre A7
   est aussi appel� pointeur de pile. Comme toujours nous utiliserons
   le vocabulaire anglo-saxon, et nous dirons Stack Pointer, en abr�-
   g�  SP. Pour  cette raison et parce que l'usage en est ainsi, nous
   remplacerons  d�sormais A7 par SP (qui ne se lit pas "�ss-p�" mais
   bien STACK POINTER!!!).

   Imaginons  que  nous  voulions sauvegarder D0 � l'entr�e de la su-
   broutine:

                      Il  ne  faudra pas oublier de le r�cup�rer � la
   sortie! D�pla�ons  donc  le  contenu  de D0 vers la pile. Essayons
   MOVE.L  D0,SP  et  r�fl�chissons: Ceci  va mettre le contenu de D0
   dans  A7, malheureusement  ce n'est pas ce que nous voulons faire.
   En  effet  nous  d�sirons  mettre le contenu de D0 DANS le tube, �
   l'endroit indiqu� par A7 (donc SP).

   Ceci  va se faire avec  MOVE.L  D0,(SP) ,les parenth�ses indiquant
   que la source de l'op�ration c'est l'int�rieur du tube.

   Effacez le programme actuel et tapez le suivant.

          MOVE.L     #$12345678,D0
          MOVE.L     D0,(A0)
          MOVE.W     D0,(A1)

   Assemblez  puis  comme  d'habitude  d�buggez. D0 prend  la  valeur
   $12345678, puis  D0 est  transf�r� dans sa totalit� (� cause du .L
   qui  indique que l'op�ration se passe sur un mot long) � l'adresse
   qui est not�e dans A0, ensuite le poids faible de D0 est transf�r�
   dans  le  tube  �  l'adresse  not�e  en A1. Pour le v�rifier, vous
   pouvez  activer  la fen�tre 3 et demander � placer l'adresse not�e
   dans  A0 en haut de cette fen�tre, et vous constaterez qu'effecti-
   vement la valeur de D0 se trouve bien dans le 'tube'.

   Nous allons donc utiliser ce type de transfert pour sauvegarder D0

   Mais  r�fl�chissons encore un peu. MOVE.L   D0,(SP) va bien placer
   le  contenu du long mot D0 dans le tube, mais si nous voulons pla-
   cer  une  autre valeur sur la pile, celle-ci va �craser notre pre-
   mi�re  valeur  car  avec  MOVE.L  D0,(SP) l'adresse indiqu� par SP
   (donc A7) ne va pas �tre modifi�e, ce qui devrait �tre le cas.

   Nous  allons donc r�aliser le transfert diff�remment (en fait nous
   allons  encore  am�liorer  notre  vocabulaire, puisque nous allons
   parler maintenant de type ou de mode d'adressage).

   Nous allons faire
          MOVE.L     D0,-(SP)

   C'est le mode d'adressage avec pr�-d�cr�mentation. Derri�re ce vo-
   cabulaire  pompeux  se  cache toute une suite d'�v�nements. En une
   seul  instruction, nous diminuons l'adresse du pointeur de pile de
   4 (puisque dans notre exemple nous voulions transf�rer un long mot
   donc 4 octets), et nous pla�ons en m�moire � cette adresse le long
   mot D0.

   Pour r�cup�rer D0, c'est-�-dire d�piler, il faudra faire:

          MOVE.L     D0,(SP)+

   Comme  nous avions d�cr�ment� le pointeur de pile pour ensuite d�-
   poser D0 � cette adresse, nous r�cup�rons donc D0 sans oublier en-
   suite  de  modifier  le  pointeur  de pile dans l'autre sens, pour
   qu'il  retrouve son ancienne position. Notons que dans le cas pr�-
   sent, et  si  nous nous contentons de r�fl�chir tr�s sommairement,
   il  aurait �t� possible de sauver D0 par  MOVE.L  D0,(SP) et de le
   r�cup�rer  par MOVE.L  (SP),D0.  C'est compter sans le fait que la
   pile est un r�servoir commun � beaucoup de choses. Il faut donc de
   pr�f�rence jouer � chaque fois le jeu d'un empilage correct et r�-
   fl�chi  mais aussi d'un d�pilage 'collant' parfaitement avec l'em-
   pilage pr�c�dent.

   V�rifions tout cela avec l'exemple suivant:
          MOVE.L     #$12345678,D0 valeur dans D0
          MOVE.W     #$AAAA,D1     valeur dans D1
          MOVE.L     D0,-(SP)      sauve D0.L sur la pile
          MOVE.W     D1,-(SP)      idem D1 mais en word
          MOVE.L     #0,D0         remet D0 � 0
          MOVE.W     #0,D1         et D1 aussi
          MOVE.W     D1,(SP)+      r�cup�re D1 (word)
          MOVE.L     D0,-(SP)      puis D0

   Assemblez  puis  faites d�filer ce programme pas � pas sous MONST.
   Notez  plusieurs  choses: tout  d'abord  des  commentaires ont �t�
   ajout�s  au  source. Il suffit que ceux-ci soient s�par�s des op�-
   randes  pour  que l'assembleur sache qu'il s'agit de commentaires.
   Si  vous d�sirez taper une ligne de commentaires (c'est-�-dire que
   sur  celle-ci  il  n'y aura rien d'autre que ce commentaire), vous
   devez le faire pr�c�der du caract�re �toile ou d'un point virgule.

   Seconde  chose, nous  avions empil� D0 puis D1, ensuite nous avons
   d�pil� D1 puis D0. Il faut en effet bien faire attention � l'ordre
   et  aux  tailles  de ce que nous empilons, afin de pouvoir d�piler
   les m�mes tailles, dans l'ordre inverse de l'empilage.

   Voici un dernier exemple.
          MOVE.L     #$12345678,D0
          BSR        AJOUTE     saut vers subroutine
          MOVE.L     D0,D1      transfert

AJOUTE    MOVE.L     D0,-(SP)   sauve d0.l sur la pile
          MOVE.W     #8,D0
          MOVE.W     #4,D1
          ADD.W      D0,D1
          MOVE.L     (SP)+,D0
          RTS

   Assemblez  puis  suivez le d�roulement sous MONST en �tudiant bien
   le  d�roulement. Vous voyez bien que le BSR sauve l'adresse de re-
   tour  sur la pile, puis que D0 et mis par dessus pour �tre ensuite
   r�cup�r�.  Ensuite c'est l'adresse de retour qui est reprise et le
   programme remonte.

   Maintenant, provoquons  une  erreur, une  toute petite erreur mais
   qui  sera fatale � notre programme. Au lieu de r�cup�rer D0 par un
   MOVE.L    (SP)+,D0, commettons  une faute de frappe et tapons � la
   place MOVE.W   (SP)+,D0.

   Assemblez  et  suivez pas � pas. Au moment de la sauvegarde de D0,
   ce  sont bien 4 octets qui vont �tre plac�s sur la pile, modifiant
   celle-ci  d'autant. Malheureusement  la  r�cup�ration ne va re-mo-
   difier  cette pile que de 2 octets. Au moment o� l'instruction RTS
   va  essayer  de r�cup�rer l'adresse de retour, le pointeur de pile
   sera faux de 2 octets par rapport � l'endroit o� se trouve r�elle-
   ment  cette  adresse  de  retour, et  celui-ci  va  se faire � une
   adresse fausse. En conclusion: prudence et rigueur!!!!!!

   Nous  venons  donc de voir que la pile �tait utilis�e par le 68000
   pour  certaines  instructions, et qu'elle �tait bien commode comme
   sauvegarde.

   Il  est aussi possible de l'utiliser pour transmettre des donn�es,
   c'est ce que nous allons voir pour conclure ce chapitre.

   Probl�me: Notre  programme principal utilise les registres A0 � A6
   et  D0 � D6. Il va appeler une subroutine destin�e � additionner 2
   nombres  et � retourner le r�sultat dans D7. Il faudra donc utili-
   ser  2 registres  par  exemple D0 et D1 pour travailler dans notre
   routine, et donc les sauvegarder � l'entr�e de celle-ci.

   Voici le d�but du programme.

          MOVE.L     #$11111111,D0
          MOVE.L     #$22222222,D1
          MOVE.L     #$33333333,D2
          MOVE.L     #$44444444,D3
          MOVE.L     #$55555555,D4
          MOVE.L     #$66666666,D5
          MOVE.L     #$77777777,D6

   Les  7 premiers  registres  sont  remplis avec des valeurs bidons,
   juste  pour nous permettre de v�rifier leurs �ventuelles modifica-
   tions.

   Maintenant  il  faut placer les 2 nombres que nous d�sirions addi-
   tionner, dans un endroit tel qu'ils pourront �tre r�cup�r�s par la
   routine d'addition. Pla�ons donc ces 2 nombres sur la pile.

          MOVE.L     #$12345678,-(SP)
          MOVE.L     #$00023456,-(SP)
          BSR        AJOUTE            et en route !

   R�digeons  maintenant  notre subroutine, afin de suivre l'ordre de
   travail du 68000.

       De quoi aurons nous besoin dans cette routine ?

       De  D0 et  de  D1 qui vont recevoir les nombres empil�s et qui
   vont nous servir au calcul. Il va nous falloir �galement un regis-
   tre  d'adresse. En  effet, lorsque nous allons d�piler nous allons
   modifier le pointeur de pile, or nous venons d'effectuer un BSR le
   68000 a  donc  empil� l'adresse de retour sur la pile, et modifier
   celle-ci  va  compromettre  le  retour! Nous  allons  donc  copier
   l'adresse de la pile dans A0, et utiliser cette copie. 

   Note: j'ai  d�cid� d'utiliser D0, D1 et A0 mais n'importe quel au-
   tre registre aurait tout aussi bien convenu.

   Commen�ons donc par sauver nos 3 registres.

   Cela pourrait se faire par:

          MOVE.L     D0,-(SP)
          MOVE.L     D1,-(SP)
          MOVE.L     A0,-(SP)

   Note: je rappelle que cela se lit move long!

   Mais  le  68000 poss�de  une instruction tr�s utile dans un pareil
   cas, qui permet de transf�rer plusieurs registres d'un coup.

   Nous allons donc faire:

          MOVEM.L    D0-D1/A0,-(SP)

   Ce qui se lit: move multiple registers.

   Si nous devions transf�rer de D0 � D5 nous aurions fait :

          MOVEM.L  D0-D5,-(SP)

   et, pour transf�rer tous les registres d'un seul coup:

          MOVEM.L D0-D7/a0-A6,-(SP)        Compris?

   Sauvons  maintenant  l'adresse  de  la  pile  dans A0. Comme c'est
   l'adresse  qu'il  faut  sauver et non pas le contenu, cela se fait
   par:
          MOVE.L     A7,A0      transfert du registre A7 vers A0

   Maintenant nous allons r�cup�rer les 2 nombres que nous avions em-
   pil� avant l'instruction BSR.

   Imaginons  ce qui s'est pass�. (A ce propos je vous conseille TRES
   fortement  de vous aider d'un papier et d'un crayon. N'h�sitez pas
   � �crire sur ces cours. Ce sont les v�tres et je ne les r�clamerai
   pas!

   Faire  un  petit  dessin  ou de placer des pi�ces sur votre bureau
   pour  vous  aider � comprendre est une excellente chose. Bien sou-
   vent  les manipulations de m�moire ont tendance � devenir abstrai-
   tes et un petit dessin arrange bien des choses!)

   Nous  avons d�cal� de 4 octets le STACK POINTER, puis nous y avons
   d�pos� $12345678. Mais dans quel sens avons nous d�cal� ce SP ?

   Vers  le d�but de la m�moire, vers l'adresse 0 de notre tube puis-
   que  nous  avons  fait  -(SP). Le pointeur de pile remonte donc le
   long  du  tube. Nous avons ensuite recommenc� la m�me chose pour y
   d�poser  $23456. Ensuite BSR, donc m�me chose mais r�alis� automa-
   tiquement par le 68000 afin d'y d�poser l'adresse de retour (4 oc-
   tets).

   Est-ce  tout? Non car une fois rendu dans la subroutine nous avons
   d�pos�  sur la pile les registres D0, D1 et A0. Le transfert ayant
   �t� effectu� sur le format long mot (MOVEM.L) nous avons transf�r�
   3 fois 4 octets soit 12 octets (bytes).

   Notre  copie de A7 qui est en A0 ne pointe donc pas sur nos 2 nom-
   bres  mais  beaucoup  plus loin. Le nombre que nous avons plac� en
   second  sur la pile est donc � 16 vers le d�but du tube (faites le
   calcul: 1BSR, + 12 bytes de sauvegarde cela fait bien 16 bytes) et
   le  nombre  plac�  en  premier  sur  la pile suit son copain et se
   trouve  donc � 20 bytes d'ici, en vertu toujours du principe de la
   pile: le dernier entr�, c'est le premier sorti.

   Nous  pouvons  donc  dire  que $23456 est � A0 d�cal� de 16 et que
   $12345678 est � A0 d�cal� de 20.

   Pour r�cup�rer ces 2 nombres plusieurs actions sont possibles:

   1) ajouter 16 � l'adresse de A0 puis r�cup�rer.

   Une addition d'adresse se fait par ADDA (add adress).

   Nous faisons donc
          ADDA.L     #16,A0

   A0 pointe donc maintenant sur $23456, r�cup�rons donc ce nombre et
   profitons du mode d'adressage pour avancer l'adresse indiqu�e dans
   A0 et ainsi tout de suite �tre pr�t pour r�cup�rer l'autre nombre.
          MOVE.L     A0)+,D0
   L'adresse  ayant  �t�  augment�e  nous  pouvons  donc r�cup�rer la
   suite:
          MOVE.L     (A0)+,D1

   2) Autre m�thode, utilisant un autre mode d'adressage:

   La  m�thode pr�c�dente pr�sente un inconv�nient: apr�s le ADDA, A0
   est  modifi�  et  si nous voulions garder cette adresse, il aurait
   fallu le sauvegarder.

   Ou  bien  nous  aurions pu ajouter le d�calage � A0, r�cup�rer les
   donn�es  et  ensuite  retirer le d�calage � A0 pour qu'il retrouve
   sont �tat de d�part.

   Autre m�thode donc, indiquer dans l'adressage le d�calage � appli-
   quer. Cela se fait par:

          MOVE.L     16(A0),D0
          MOVE.L     20(A0),D1

   Cela  permet  de  pointer sur le 16�me octet � partir de l'adresse
   donn�e par A0 et ensuite de pointer sur le 20�me par rapport � A0.
   Dans les 2 cas, A0 n'est pas modifi�.

   Voil� le listing complet de cet exemple.

          MOVE.L     #$11111111,D0         initialisation de D0
          MOVE.L     #$22222222,D1         idem
          MOVE.L     #$33333333,D2         idem
          MOVE.L     #$44444444,D3         idem
          MOVE.L     #$55555555,D4         idem
          MOVE.L     #$66666666,D5         idem
          MOVE.L     #$77777777,D6         idem
          MOVE.L     #$12345678,-(SP)      passage nombre 1 dans la pile
          MOVE.L     #$00023456,-(SP)      passage nombre 2 dans la pile
          BSR        AJOUTE                et en route !
          MOVE.L     D7,D0                 transfert du r�sultat pour voir..


   * notre subroutine
AJOUTE    MOVEM.L    D0-D1/A0,-(SP)        sauvegarde
          MOVE.L     A7,A0                 copie de SP en A0
          MOVE.L     16(A0),D0             r�cup�re 23456 et le met en D0
          MOVE.L     20(A0),D1             r�cup�re 12345678 en D1
          ADD.L      D0,D1                 addition
          MOVE.L     D1,D7                 transfert du r�sultat
          MOVEM.L    (SP)+,D0-D1/A0        r�cup�ration
          RTS                              et retour

            * Note: ce  programme  n'ayant pas de fin 'normale',
            lorsque vous* serez rendu au retour de la subroutine
            c'est-�-dire apr�s la ligne" MOVE.L D7,D0 ", quittez
            le avec Control+C,  Assemblez et suivez bien TOUT le
            d�roulement.

   Bien  s�r, il aurait �t� possible de faire cela tout diff�remment.
   Par exemple nous aurions pu �viter de travailler avec A0. En effet
   16(A0) et 20(A0) ne modifiant pas A0, il aurait �t� plus simple de
   faire  16(A7) et  20(A7) au  lieu de recopier d'abord A7 en A0. De
   m�me il aurait �t� possible de transf�rer $23456 directement en D7
   et  $12345678 en  D1 puis  de  faire ADD.L  D1,D7 afin d'�viter la
   sauvegarde  de  D0 (qui aurait �t� inutilis�e), et le transfert D1
   vers  D7 qui  n'aurait  alors pas eu lieu d'�tre. De m�me nous au-
   rions pu retourner le r�sultat par la pile au lieu de le faire par
   D7.

   Beaucoup de variantes possibles n'est ce pas ?

   Pour  terminer, un  petit exercice. Relancer ce petit programme et
   analysez  PARFAITEMENT  TOUT ce qui s'y passe. Quelque chose ne va
   pas  ! Je  vous  aide  en disant qu'il s'agit bien s�r de la pile.
   Cherchez et essayez de trouver comment faire pour arranger �a.

   La r�ponse sera au d�but du prochain cours mais essayez d'imaginer
   que c'est votre programme et qu'il ne marche pas et  cherchez!!!

   Bon, le  cours sur la pile se termine ici. Ce fut un peu long mais
   je pense, pas trop compliqu�.  Relisez le, car la pile est un truc
   d�licat dont nous allons nous servir TRES abondamment dans le pro-
   chain cours. Si vous avez � peu pr�s tout compris jusqu'ici il est
   encore  temps  de rattraper le temps perdu et de tout reprendre au
   d�but, car  il  faut  avoir PARFAITEMENT tout compris et pas � peu
   pr�s!

   Afin de vous remonter le moral, je vous signal que vous �tes pres-
   que � la moiti� du cours...

Back to ASM_Tutorial