COURS 3.TXT
Jump to navigation
Jump to search
******************************************************************
* *
* 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