COURS 3.TXT/fr: Difference between revisions
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 |
+ | * par Le F�roce Lapin (from 44E) * |
* * |
* * |
||
− | * Cours |
+ | * 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 |
+ | devez normalement avoir un peu plus d'ordre qu'au d�part, et le |
− | binaire et l' |
+ | 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 |
+ | tiel: Il est tentant de r�fl�chir en chiffre alors que bien sou- |
− | vent il serait |
+ | 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 |
+ | 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 |
+ | morts), il me faut donc 6 bits pour coder cette vitalit�. Je peux |
− | donc avoir sur un seul byte (octet) 2 choses totalement |
+ | 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 |
+ | 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. |
+ | 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 |
+ | Nous obtenons 52. Nous sommes donc en pr�sence d'un personnage de |
− | type 3, avec 52 points de |
+ | type 3, avec 52 points de vitalit�. |
− | Ceci devant maintenant |
+ | Ceci devant maintenant �tre clair, passons � une explication |
− | succinte concernant la |
+ | 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 |
+ | 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 |
+ | nous avons mis dans le tube. Cette distance est appel� 'adresse'. |
− | Le tube a un |
+ | Le tube a un diam�tre de 1 byte (octet). Lorsque je vais parler de |
− | l'adresse $6F00 (28416 en |
+ | l'adresse $6F00 (28416 en d�cimal), c'est un emplacement. A cet |
− | emplacement je peux mettre un byte. Si la |
+ | 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 |
+ | 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 |
+ | 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' |
+ | 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 |
+ | contenu du tube. Il va y trouver des chiffres qu'il va interpr�ter |
− | comme des ordres (revoir le cours 2). |
+ | 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 |
+ | droit de ce tube, de revenir en arri�re, de pr�lever le contenu du |
− | tube et d'aller le |
+ | 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 |
+ | de lire les ordres qu'il ex�cute, il y a un compteur. Comme ce |
− | compteur sert pour le programme, il est |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | Pour le moment assemblons en maintenant appuy� [ALTERNATE] puis en |
appuyant sur A. |
appuyant sur A. |
||
− | Normalement, tout s'est bien |
+ | Normalement, tout s'est bien pass� ou alors c'est que vous n'avez |
− | pas scrupuleusement |
+ | pas scrupuleusement recopi� ce 'programme'. |
− | Maintenant, |
+ | 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 |
+ | 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 |
+ | 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 |
+ | gistres de donn�es, nous voyons SR et en dessous PC. Nous pouvons |
− | remarquer que PC nous montre une adresse et la |
+ | 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 |
+ | gauche de cette fen�tre nous voyons les adresses. Symboliquement |
− | nous pouvons dire que la partie droite de cette |
+ | 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 |
+ | 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 |
+ | 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 |
+ | Normalement dans la fen�tre 2 vous devez voir notre programme avec |
− | en face de la |
+ | 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 |
+ | Sur certains micro-processeurs les programmes doivent imp�rati- |
− | vement tous se placer au |
+ | 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 |
+ | est pas forcement de m�me pour vous: c'est normal. |
− | Regardez maintenant la |
+ | Regardez maintenant la fen�tre 3 et cherchez-y la m�me adresse que |
− | celle que vous avez lue dans la |
+ | 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 |
+ | 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 |
+ | 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 |
+ | $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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | bleurs) MOVE LONG. D'ailleurs l'appellation mn�monique (qui a |
− | rapport avec la |
+ | rapport avec la m�moire, qui sert � aider la m�moire) est � rap- |
− | procher de |
+ | 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 |
+ | Puisque notre registre D0 (comme les autres d'ailleurs) et cod� |
− | sur un long mot, il contient donc 2 words |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | 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 |
+ | vons garder (4 par poche). Cela peut para�tre assez �vident mais |
− | par exemple sur l' |
+ | 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